From 3435bd6eee8c6f2cbe3da0bbf067d07261c7861e Mon Sep 17 00:00:00 2001 From: heaven Date: Sun, 6 Sep 2026 08:31:47 +0300 Subject: [PATCH] Say which of three runs was the control, since two of them differed by more than the thing they were compared for --- docs/architecture/05-decisions-log.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index dcc325b3..e6cae3fb 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -39,6 +39,7 @@ > далёк в обоих случаях, вывод приёмки не меняется, но в каноне стоит число из гейта, а не из грепа. > ⚠ **Эррата 02.09-а (D39.182, «три блокера приёмки закрыты») — у ТРЕТЬЕГО блокера не осталось носителя.** Заголовок и §1 ноты держат счёт «3 блокера», но отчёт пака называет сегодня только два: ревизия доков 02.09 сняла из `backend/docs/MONEY_HONESTY_REPORT.md` разделы «Сверка с заказом по пунктам» и «ПРИЁМКА: три блокера и пять дофиксов» (проверка: греп `^## 9.11` и `^## 1\.` по файлу — пусто, при живом `^## 6.2`). **Третий блокер — вердикт «предъявлено» поверх неработающего пути:** в снятом §1 отчёта вердикты **A0** и **A6** стояли «предъявлено» на НЕПОЛНОЙ проверке и были сняты вместе с блокером 2, а пере-предъявлены посадками `TestAHealthyGlossaryPassIsNotReportedAsALoss` и `TestTheCONSENTGateSeesAnInPlaceSourceEdit` (грепаются по `backend/`). Дословный текст снятых разделов — `git show bd2077b:backend/docs/MONEY_HONESTY_REPORT.md`. Тело ноты не переписывается (D23.3). +> ⚠⚠ **Эррата 06.09-з (`D39.213` п.2 и п.3) — ТАБЛИЦА ТРЁХ ПРОГОНОВ ЧИТАЕТСЯ КАК КОНТРОЛИРУЕМОЕ СРАВНЕНИЕ, А БЫЛА ГОЛОСОВАНИЕМ 2:1 ПО ТРЁМ РАЗНЫМ КОНФИГУРАЦИЯМ — и это же описание ПРЯТАЛО мою сильнейшую улику. Нашёл верификатор; пере-проверено мной.** **(а) «Три прогона по ОДНОМУ дереву» — неверно.** Прогон (б) шёл по дереву с уже наложенной починкой, а она несла новый гейт-тест: в популяции `func Test` дерево ушло 849 → 850. **(б) Прогон (в) — ДО починки, а не после.** Мой чистый `go test` написан в **07:36:45**, эррата с его числами опубликована `be45500` в **07:38:50**, а починка `201363b` — в **08:04:37**. ⇒ группировать (б) и (в) как согласных против (а) значило выдавать за контроль то, что им не было. ⭐ **(в) ГЛАВНОЕ: контроль в таблице ЕСТЬ, и он другой.** Разложенные по признакам, а не по порядку: **(а)** до починки · лог ОБЩИЙ, зона гнала параллельно · **21/7**; **(в)** до починки · СВОЙ файл вне каталога зоны · **20/9**; (б) после починки · попрогонный · 20/9. **(а) и (в) — ОБА до починки и различаются расположением лога — и они расходятся.** ⇒ изолированная переменная — РАСПОЛОЖЕНИЕ ЛОГА, а не починка, и (б) не добавляет ничего сверх того, что (в) показал БЕЗ неё. **(г) Механизм предъявлен исполнением, а не правдоподобием** (проба верификатора, повторена мной в своей форме): два писателя, оба через `>` в один файл — как в старом рецепте, — дают **646 строк из 1200**, ОБЕ фракции в файле, 554 строки потеряны. То есть чужие строки появляются, а свои пропадают, и потеря асимметрична: ровно призрачный лишний пакет и спрятанные скипы. ⇒ **статус причины: НЕ догадка и НЕ замер — ВЫВОД, стоящий на до-починочном контроле и воспроизводимом механизме.** Тот конкретный случай невосстановим: лог стёрт самим прибором. ⚠ Урок формы: **один баннер накрыл две эпистемологии, и слабейшая из них была та, ради которой пункт написан.** Статус утверждения объявляется рядом с утверждением, а не общей шапкой на абзац. > ⚠⚠ **Эррата 06.09-ж (эррата 06.09-г · `D39.212` п.6 · эррата 28.08-и) — ТРИ НЕПРАВДЫ, ВЪЕХАВШИЕ В КАНОН ТЕМ ЖЕ ДВИЖЕНИЕМ, КОТОРЫМ Я ИСПРАВЛЯЛ ПРЕДЫДУЩИЕ. Все три — в текстах ПРО СОБСТВЕННЫЕ ОШИБКИ; нашёл Fable 5 сверкой с деревом.** **(а) «Расщепление стояло ЧЕТВЕРО СУТОК» (эррата 06.09-г) — неверно: четыре с половиной ЧАСА.** `3e40c36` — 06.09 **03:00**, `1cae0ac` — 06.09 **07:30**. Полная история границы (`git log -L`, замер Fable, пере-проверен мной по датам коммитов): `f0d8fed` 08.08 02:26 ввёл `minimum: 1` ещё БЕЗ прозы о нуле · `278ffd8` 06.09 01:40 поставил `0` · `3e40c36` 03:00 вернул `1` · `1cae0ac` 07:30 вернул `0`. **Ни один отрезок не равен четырём суткам.** ⚠ Суть эрраты 06.09-г от этого не меняется — расщепление было, и написано оно одним заходом, — но ДЛИТЕЛЬНОСТЬ я не мерил, а написал по ощущению, и ощущение соврало в двадцать раз. **(б) `D39.212` п.6: «семь флагов, ШЕСТЬ ложных, настоящих два» — 6+2≠7; ложных ПЯТЬ.** Зонный журнал называет их поимённо (`target` · `RunRequest.chapters` · `.characters` · `character_count_exact` · `kind`), и пять плюс два дают семь. Число «шесть» я взял из ПИСЬМА зоны, не пересчитав, — при том что её собственный журнал держит верное. **Ровно класс эрраты 06.09-д: величина, перенесённая из чужого текста без пере-счёта, — и во второй раз за смену подряд.** ⚠ И арифметика была видна на месте: сумма не сходилась с итогом в той же фразе. **(в) «Код переехал вместе с ПЕРЕИМЕНОВАНИЕМ файла» (аннотация «испр. 06.09» внутри эрраты 28.08-и) — переименования не было.** `backend/internal/pipeline/seeding.go` ЖИВ и сегодня (128 строк); `bankmaterialize.go` **ДОБАВЛЕН** `6ec9f8a` 29.08, и в него код ВЫДЕЛЕН, а не переименован вместе с файлом. Верная причина, по которой линт не мог угадать адрес, — другая и проще: якорь был написан ГОЛЫМ именем, а голое имя отсеивается на `docs/scripts/counts.py:585`=`"/" not in rel` ДО всякой проверки файла. Та же ложь стояла в строке 306 бэклога и там исправлена. ⚠ **Урок общий для всех трёх: текст про собственную ошибку пишется в тот момент, когда автор уверен, что уж ЭТО он знает, — и потому проверяется хуже обычного.** Ни одну из трёх не поймал бы ни один гейт: все три проза, и все три проверяемы одной командой, которую я не набрал. > ⚠ **Эррата 06.09-е (D39.211 п.1) — ТОТ ЖЕ НЕДОСЧЁТ ПАКЕТОВ УНАСЛЕДОВАН РАТИФИЦИРОВАННЫМ АКТОМ, А ТОЧНЫЙ РАЗБОР УЖЕ НЕВОССТАНОВИМ.** Пункт 1 цитирует числа зоны v13: «`MAKE-EXIT=2`, **21 пакет**, 20 ok». Пакетов у платформы **ДВАДЦАТЬ** — пере-считано 06.09 чистым `go test ./... -race -count=1 -v`: 20 различных, ни одного без тестов; список зона предъявила поимённо. ⇒ «21» здесь — то же, что в эррате 06.09-д: число СТРОК вывода, а не пакетов. ⛔ **А вот раскладку «20 ok» при `FAIL 1` восстановить уже нечем: лог v13 удалён самим прибором** (`make check` пишет в фиксированный `platform/.check.log` и стирает его — строка 310). Наиболее вероятное чтение — 19 прошедших пакетов, один упавший (`gates`, ратифицированный гейт версии) и одна строка-дубль, — но это РЕКОНСТРУКЦИЯ, и я помечаю её как реконструкцию, а не как замер. ⭐ **Это и есть цена дефекта строки 310, предъявленная не рассуждением, а случаем: прибор стёр улику под ратифицированным актом, и число в каноне теперь неисправимо — его можно только пометить.** ⚠ Прочие числа пункта 1 под сомнение НЕ ставятся и подтверждены косвенно: «тестов 850» той же строки согласуется с ростом счёта на один после нового пина (`runs.TestABookWithNothingLeftIsRefusedRatherThanSoldAsAZeroChapterRun`) — ⚠ **довод ВЕРЕН, испр. дважды 06.09: я снял его по находке верификатора, а он находку отозвал, и отзыв верен.** В популяции прибора: `32a6050` — **850**, после ровно ОДНОГО пина `33b896b` — **851**. Ровно +1, ровно один пин. Прежнее снятие опиралось на счёт `func Test`, приложенный к числам другой популяции (`D39.202` п.2г). ⚠ И отдельно: «21 пакет из 21» в `D39.170` — НЕ ошибка и не трогается, там речь о батарее ДВИЖКА, у которого свой набор пакетов; проверено прежде, чем править. > ⚠⚠ **Эррата 06.09-д (D39.212 п.8) — ЧИСЛА ПРИЁМКИ, КОТОРЫЕ Я НАЗВАЛ СВОИМИ, СНЯТЫ ПРИБОРОМ С ДОКАЗАННЫМ ДЕФЕКТОМ, И ДВА ИЗ НИХ НЕВЕРНЫ.** **(а) Пакетов ДВАДЦАТЬ, а не 21.** 21 — это число строк `^ok`, среди которых `internal/money` напечатан ДВАЖДЫ; различных пакетов двадцать. ⭐ **Платформенная зона пришла к тому же числу ДРУГИМ путём** (у неё лишней была голая итоговая строка `FAIL` рядом со строкой упавшего ПАКЕТА) и поймала себя сама. То есть **одна и та же ошибка — величина, снятая с вывода прибора без разбора, что прибор печатает, — поймала обе стороны НЕЗАВИСИМО, в один час, на одном выводе**; это сильнее любого из двух наблюдений по отдельности. **(б) Скипов ДЕВЯТЬ, а не семь, и семь были не ошибкой счёта, а ложной уликой.** Число 7 снято из `make check`, чей лог живёт по фиксированному пути `platform/.check.log` и затирается параллельным прогоном (строка 310, дефект найден зоной в тот же час). ⛔ **Зона меня об этом предупредила, и я возразил «у меня обошлось — в моём логе нет ни одного `No such file`». Возражение было слабым: отсутствие СИМПТОМА не есть доказательство целости улики**, — и чистый пере-прогон это подтвердил. Строка 310 укусила ровно того, кто её завёл, в тот же час, что и завёл. **(в) Числа, снятые `go test ./... -race -count=1 -v` в файл ВНЕ каталога зоны:** `GO-EXIT=0` · **20 пакетов ok, ни одного без тестов** · верхнеуровневых прогонов **851 — и это верно для минуты прогона** (⚠ **испр. дважды 06.09.** Число было снято, а затем ВОЗВРАЩЕНО: верификатор нашёл «851 не существовало ни на одном коммите», я снял его на `44faafc`, после чего он сам же отозвал находку, и отзыв верен. **Пере-мерено мной ТРЕТЬИМ способом, чистыми экспортами `git archive`:** прибор считает верхнеуровневые ПРОГОНЫ вывода `go test -v`, а это `Test` **плюс `Fuzz`** — фаззер в обычном режиме гоняет сид-корпус и печатает `--- PASS: FuzzXxx`; у платформы таких таргетов два, и они стоят в моём же логе (`FuzzDecoder`, `FuzzSafeReturnTo`). Отсюда: `32a6050` 07:20 — 848+2=**850** · `93f098c` 07:33 — 849+2=**851** · `e92d411` 08:06 — 850+2=**852**. Лог написан 07:36, когда стоял `93f098c`, ⇒ **851 принадлежит настоящему коммиту**, и разложение 842 PASS + 9 SKIP сходится с деревом, а не только само с собой. На пине — **852**, разница ровно в гейт-тесте, заланденном `201363b`. ⛔ **Ошибка и находки, и моей проверки — ОДНА: сравнивались РАЗНЫЕ ПОПУЛЯЦИИ** — `func Test` против «верхнеуровневых прогонов», расходящиеся на два `Fuzz`. ⛔⛔ **И моя проверка не была проверкой: я пере-мерил ЕГО методом и потому воспроизвёл его ошибку, а не нашёл её.** Совпадение двух замеров доказывало лишь, что мы считаем одно и то же не то) · с подтестами PASS 1094 · `ALARM PD-count: 12 (baseline 12)`. ⭐ **Сошлось с зоной с двух сторон:** у неё на тех же **851** — PASS 846 · SKIP 5, и разница ровно ЧЕТЫРЕ теста — это четыре гейта стенда, которых я не поднял (из пяти у меня был только `TM_PLATFORM_TEST_DSN`). Общее число совпало, расхождение объяснено и названо. **(г) Якорь п.6 был наведён на НЕУНИКАЛЬНЫЙ токен** и пере-наведён (`2ed1c0b`): `Structure *string` встречается в `v0.go` ДВАЖДЫ — `:216` (`wireBook`) и `:308` (`wireOrderOptions`), — так что скрипт мог сесть на чужое поле, а линт бы позеленел. Теперь `v0.go:306-308`=`null when no manifest`, токен по файлу единственный. ⇒ **уточнение к п.7 той же ноты: токен надёжнее номера строки только когда он УНИКАЛЕН. Неуникальный токен ХУЖЕ номера — номер врёт громко и ловится линтом, а он врёт молча и линт зеленит.** @@ -2652,9 +2653,9 @@ $2.00» не мерил никто), **а утверждение о ПРОШЛО **1. Что заландено.** `201363b` (5 путей): попрогонное имя лога (`.check.log.$$`) · гвард «лога нет ⇒ выйти КРАСНЫМ до первого чтения» · гейт формы `gates.TestTheBatteryCannotReportCleanlinessWithoutItsLog` · ряд регистра `PD-454` · зонный журнал. Строка 310 закрыта. Заказан отдельным актом ПОСЛЕ дофикса по канону — зона намеренно не смешала предметы посреди лендинга, и это верно. -**2. ⛔ ДЕФЕКТ ПОРТИЛ НЕ ГИПОТЕТИЧЕСКИЕ ЧИСЛА, А МОИ — И ЭТО ЗАМЕРЕНО, А НЕ ВЫВЕДЕНО.** Три прогона по одному дереву: **(а)** мой `make check` при ОБЩЕМ логе, пока зона гнала свой параллельно — 21 строка `ok`, **7** скипов, `internal/money` дважды; **(б)** мой `make check` после починки, лог попрогонный — **20**, **9**, один; **(в)** мой `go test ./... -race -count=1 -v` в файл ВНЕ каталога зоны — **20**, **9**, один. ⇒ (б) и (в) сходятся ДО СТРОКИ, выброс — (а). **Общий лог дал призрачный лишний пакет и СПРЯТАЛ ДВА СКИПА.** ⚠ Направление ошибки — худшее из возможных: прибор ЗАНИЗИЛ то, чего не измерил, и наружу это шло как «прогналось всё». Именно на этих испорченных числах я и написал п.8 акта `D39.212`. +**2. ⛔ ДЕФЕКТ ПОРТИЛ НЕ ГИПОТЕТИЧЕСКИЕ ЧИСЛА, А МОИ.** (⚠ **Испр. эрратой 06.09-з:** заголовок нёс «И ЭТО ЗАМЕРЕНО, А НЕ ВЫВЕДЕНО» над двумя утверждениями РАЗНОГО статуса — расхождение замерено, причина выведена; и «по одному дереву» неверно, деревья различались.) Три прогона: **(а)** мой `make check` при ОБЩЕМ логе, пока зона гнала свой параллельно — 21 строка `ok`, **7** скипов, `internal/money` дважды; **(б)** мой `make check` после починки, лог попрогонный — **20**, **9**, один; **(в)** мой `go test ./... -race -count=1 -v` в файл ВНЕ каталога зоны — **20**, **9**, один. ⇒ (б) и (в) сходятся ДО СТРОКИ, выброс — (а). **Общий лог дал призрачный лишний пакет и СПРЯТАЛ ДВА СКИПА.** ⚠ Направление ошибки — худшее из возможных: прибор ЗАНИЗИЛ то, чего не измерил, и наружу это шло как «прогналось всё». Именно на этих испорченных числах я и написал п.8 акта `D39.212`. -**3. ⚠ ПОПРАВКА К ЭРРАТЕ 06.09-д: причина названа неверно, и назвал я её ДОГАДКОЙ, поданной как наблюдение.** Там сказано, что 21-я строка — это `internal/money`, напечатанный дважды. Число (пакетов 20) верно, а МЕХАНИЗМ нет: дубль был артефактом общего лога, а не свойством рецепта. Улики: Fable воспроизвести дубль не смог (20 строк, все различны) · после починки он исчез · зона объясняла ту же единицу совсем иначе (лишняя голая строка `FAIL`), то есть три наблюдателя видели три разных «причины» одного числа. ⭐ Это ровно то, в чём зона уличила СЕБЯ пунктом 7 акта `D39.211` («объяснение чистого `sqlc diff` было ДОГАДКОЙ и неверной»), — и теперь то же со мной, в тексте про собственную ошибку. +**3. ⚠ ПОПРАВКА К ЭРРАТЕ 06.09-д: причина названа неверно, и назвал я её ДОГАДКОЙ, поданной как наблюдение.** (⚠ **Испр. эрратой 06.09-з:** «три наблюдателя видели три причины ОДНОГО числа» неточно — «21» у зоны и «21» у меня суть РАЗНЫЕ числа из разных источников; и нынешняя причина — не третья догадка, а вывод с до-починочным контролем и воспроизводимым механизмом.) Там сказано, что 21-я строка — это `internal/money`, напечатанный дважды. Число (пакетов 20) верно, а МЕХАНИЗМ нет: дубль был артефактом общего лога, а не свойством рецепта. Улики: Fable воспроизвести дубль не смог (20 строк, все различны) · после починки он исчез · зона объясняла ту же единицу совсем иначе (лишняя голая строка `FAIL`), то есть три наблюдателя видели три разных «причины» одного числа. ⭐ Это ровно то, в чём зона уличила СЕБЯ пунктом 7 акта `D39.211` («объяснение чистого `sqlc diff` было ДОГАДКОЙ и неверной»), — и теперь то же со мной, в тексте про собственную ошибку. **4. ⛔ ИНСТРУМЕНТ ПРОТИВ ЛОЖНОЙ ЗЕЛЕНИ САМ НЁС ЛОЖНУЮ ЗЕЛЕНЬ — найдено приёмкой, до лендинга.** Первая редакция гейта требовала, чтобы после гварда был шаг, начинающийся с `exit`, но НЕ требовала ненулевого кода. Замерено мной: `exit 1` → `exit 0` — гейт **зелен**; и сквозное следствие исполнением (гвард `exit 0` + стаб, не пишущий лога) — **`MAKE-EXIT = 0` при напечатанной строке «THE BATTERY LEFT NO LOG»**. ⇒ ложная справка не исчезала, а **переезжала из СТРОКИ, которую читает человек, в КОД ВОЗВРАТА, который потребляет машина**, — и это хуже исходного дефекта. ⚠ Сообщение самого гейта при этом говорило «so this exits RED» — **текст обещал больше проверенного, то есть болезнь пака сидела внутри лекарства от неё**.