From 13117371f2649fe3872852b74bd19b641f51179a Mon Sep 17 00:00:00 2001 From: heaven Date: Fri, 18 Sep 2026 17:46:26 +0300 Subject: [PATCH] Ratify readiness for the cold run with an explicit list of what the act does not claim, and close the gender directive row the data now satisfies --- docs/BACKLOG.md | 3 +- docs/PROGRESS.md | 2 +- docs/architecture/05-decisions-index.md | 3 +- docs/architecture/05-decisions-log.md | 112 +++++++++++++++++++++++- 4 files changed, 115 insertions(+), 5 deletions(-) diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index ffe42a8d..f063e29e 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -3,7 +3,7 @@ > **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено. > ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`). > ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **375** строк · зона бэкенд **201** строго / **254** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **203** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **374** строк · зона бэкенд **200** строго / **253** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **202** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп. ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) @@ -402,7 +402,6 @@ | 492 | **ДВИЖОК ПУБЛИКУЕТ «РЕШЕНО РАНЬШЕ», А НАРУЖУ ЭТО НЕ ВЫХОДИТ: платформенная половина `settled_earlier` не построена.** Движок отдаёт в проекции банка два аддитивных поля — счётчик `BankConsolidation.settled_earlier` и флаг строки предложения `settled_earlier` (`backend/internal/pipeline/bankexport.go:115` и `:168`), — которыми говорит, что передача решена ПРЕЖНЕЙ покупкой и роли за неё не платили. ⚠ **Замер 17.09 с напечатанным контролем, потому что это отрицательное утверждение:** `settled_earlier` в `platform/` — **0 файлов**, при том что соседнее по секции `never_asked` прибор видит в **ВОСЬМИ** файлах, из них не-тестовых шесть — `platform/internal/ingest/bank.go` (модель и json-форма) · `httpapi/reading.go` · `httpapi/project.go` · `pgstore/readmodel.go` (upsert и select) · **колонка Postgres `platform/internal/pgstore/migrations/00036_bank_read_out.sql:57`**; знаменатель — 261 прочитанный файл зоны (217 `.go`, 44 `.sql`). ⚠ Первая редакция этого ряда писала «в ЧЕТЫРЁХ местах» — число было ЗАНИЖЕНО, потому что мой греп шёл только по `.go` и не видел ни хранилища, ни миграции; пере-снято после поправки сессии `textmachine-main-57`, подтверждено моим прибором по файлам всех типов. ⇒ платформа собирает секцию ПОИМЁННЫМ перечислением полей — включая СХЕМУ БАЗЫ, — и аддитивное поле движка теряется молча, а не доезжает само; цена половины поэтому выше, чем правка проекции: нужна миграция. ⛔ **Почему поле НЕ внесено в канон авансом:** гейт версии сверяет НОМЕР, а не форму, поэтому канон, объявивший поле, которого не отдаёт ни один деплой, прошёл бы зелёным — это дословно класс `PD-399` (канон и деплой разошлись по полям при совпавшем номере). Контракт двигается, когда у поля появится читатель, а не раньше. ⛔ **Чем это стоит продукта:** на экране подписи человек видит строку без пометки, что её передача пришла из прошлой покупки, и читает её как предложение ЭТОГО прогона; у флага `invented` при этом намеренно нет значения на такой строке, так что без соседнего поля отсутствие флага читается как «черновики это предлагали». То есть половина смысла, купленного движком, до платящего не доходит | платформа | скоро | секция консолидации и строка предложения несут `settled_earlier` наружу, поле внесено в канон минором вместе с читателем | замер оркестратора 17.09, движковая половина построена сессией `textmachine-main-57` | | 493 | **ХАРНЕСС МУТАЦИЙ ЗОНЫ ЗАСЧИТЫВАЕТ ВЫЖИВШЕЙ ПОСАДКУ, ЧЕЙ ШАБЛОН `-run` НЕ ВЫБРАЛ НИ ОДНОГО ТЕСТА.** `platform/tools/mutate.py`, `verdict()`: ветка `if code == 0` возвращает «выжила» безусловно, не спрашивая, запускался ли пин вообще; `baseline()` гоняет тот же набор и требует нулевого кода, поэтому пустой шаблон проходит базу ЗЕЛЁНЫМ и после посадки засчитывается выжившей. ⚠ **Направление ошибки безопасное** — лишняя «дыра», а не лишняя «поимка», — и числа пака, который харнесс строил, не испорчены: замерено оркестратором, что все 26 якорей каталога встречаются в дереве ровно по разу и записей с несуществующим пином ноль. ⛔ Но фикстурный каталог самого харнесса несёт ШЕСТЬ форм исхода (пойман пином · красное другим тестом · выжила · якоря нет · база красная · пина нет), и седьмой — «шаблон не выбрал ни одного теста» — среди них НЕТ, то есть собственный пин прибора этого класса не стережёт. Родня ряда **486**, которым прибор и построен: там лечилось «любое красное засчитывается поимкой», здесь остаётся зеркальное «любое зелёное засчитывается выживанием» | платформа | скоро | пустой шаблон `-run` даёт исход «НЕ ИЗМЕРЕНА», и это запинено седьмой формой фикстурного каталога | линза приёмки 17.09, подтверждено чтением `verdict()` | | 494 | **ФИКСТУРА ПРЕДЕЛА ПЕРЕЗАПУСКОВ ДЕРЖИТ ТРАТУ НУЛЁМ — ПИН ОТЧИТЫВАЕТСЯ ЗА КЛАСС, А МЕРЯЕТ СРЕЗ.** Все четыре денежных пина капа в `platform/internal/runs/attemptcap_test.go` гоняют `f.engine.set(… Spend: usd(0))` при `f.runner.alive = false`, поэтому утверждение «холд вернулся целиком» осмысленно ровно на НУЛЕВОЙ трате. Класс «предел сработал на прогоне, который УЖЕ что-то потратил» идёт другой веткой расчёта и не измерен ничем: пинов капа на ненулевой трате в зоне нет. ⚠ Это не дефект пака — поведение при нуле верно и запинено, — а НЕПОЛНОТА, названная приёмкой и принятая зоной в её же блок «где прибор слеп». Норма, под которую ряд заводится: если фикстура держит что-то постоянным, пин отчитывается за КЛАСС, а меряет СРЕЗ, и молчит о том, какой именно | платформа | скоро | предел перезапусков запинен на прогоне с ненулевой тратой, либо утверждение пина сужено до среза, который он действительно меряет | линза приёмки 17.09, пере-снято оркестратором | -| 495 | ⛔ **РЕШЕНИЕ ВЛАДЕЛЬЦА О РОДОВОЙ ДИРЕКТИВЕ ЗАПИСАНО В ЖУРНАЛЕ И НЕ ИСПОЛНЕНО В ДАННЫХ — носителя у него не было вовсе.** `backend/internal/lang/data/injection.txt:12` по-прежнему предписывает роли «при неизбежности — мужские», тогда как `D39.254` п.3 постановил «меняется ТОЛЬКО текст данных `injection.txt:12`: вместо «при неизбежности — мужские» — перестроить фразу, а если литературно не выходит, писать как читается лучше», и `D39.263` п.2 уже ОБЪЯВИЛ это исполненным («больше не предписывает»). ⚠ **Замер 17.09 с контролем:** строка в дереве жива (1 совпадение), упоминаний `injection.txt` в журнале решений **4**, рядов трекера на этот предмет — **0**. ⇒ решение существовало только в прозе ратификаций, а гейт чисел такого не видит по построению: он сторожит литералы, а не согласие решений с деревом. ⛔ **И это НЕ «правка данных за $0».** Файл встроен `go:embed` (28 упоминаний в `backend/internal/lang/embedded.go`), а `lang.EmbeddedVersion()` хеширует встроенные файлы целиком (`backend/internal/lang/embedded.go:79`=`hashEmbeddedFiles`) ⇒ хеш двигает тег кроя и ключ манифеста, у купленной книги стираются `unit_resolutions` платформы и пере-покупается нарезка. ⇒ правка идёт в ОКНО ПЕРЕКРОЯ вместе со свёртками исходника (ряд **446**) и ручкой голоса (ряд **410**); окно открыто словом владельца 17.09 и закрывается первым же продолжением книги. ⚠ Класс для следующей смены: **ратифицированное без носителя исполняется ноль раз, и вторая нота, объявившая исполнение, лжи не заметила** — акт судил намерение, а не дерево | бэкенд | скоро (в окне перекроя) | `injection.txt:12` не предписывает род по умолчанию, формулировка ратифицирована, и правка уехала ОДНИМ заходом со всеми прочими правками встроенных данных | верификация актов Fable 5 17.09, пере-снято оркестратором | | 496 | ⛔ **ЦЕЛЬ `battery-stand` НА GIT-ВОРКРИ НЕ ПРОХОДИТ ПО ПОСТРОЕНИЮ, И ЕЁ СОБСТВЕННОЕ ОБЕЩАНИЕ ИСПОЛНЯЕТСЯ НАОБОРОТ.** Рецепт ставит флаги ВНУТРИ команды (`backend/Makefile:140`=`TM_MINER_PARITY=1 TM_CHECKER_LABELS=1`), то есть у оператора выбора нет — «я неудачно запустил» тут неверный диагноз. `standdata.Root()` ищет корень по маркеру (`backend/internal/standdata/standdata.go:35`=`Root finds the repository root by MARKER`) и в воркри разрешается в корень ВОРКРИ, где `eval/.gitignore` исключает `data/` правилом-классом ⇒ путь по умолчанию указывает туда, где файла не может быть никогда. Замер 17.09: `eval/exp16/data` в воркри отсутствует, гиту файл неизвестен (`git ls-files --error-unmatch` — 0), в основном чекауте лежит (5 071 852 байта), и цель падает `TM_MINER_PARITY=1 but required data is missing`. ⛔ Комментарий цели обещает «при отсутствии данных ПАДАТЬ, чтобы наличие корпуса УТВЕРЖДАЛОСЬ, а не предполагалось» — на воркри она утверждает отсутствие стенда, которого нет только здесь, и её сообщение читается как находка о дереве. ⚠ Лечение — НЕ оверрайд пути: `TM_MINER_PARITY_CONTRAST=<путь в основном чекауте>` живёт на одной машине и умрёт при переносе, как умирают вычисленные адреса. У артефакта есть воспроизводимое происхождение — регенерируется из jieba 0.42.1 с запиненным SHA (`docs/experiments/16-bank-mining.md:183`=`jieba_dict_general_zh.txt`) ⇒ цель обязана либо регенерировать его, либо объявлять отсутствие стенда ОТДЕЛЬНЫМ исходом, а не падением. Пять корпусных тестов при поданном стенде проходят — прибор годен, негоден его путь по умолчанию | бэкенд | скоро | цель проходит на воркри без ручных оверрайдов, либо печатает «стенда нет» отдельным исходом, отличимым от падения | замер оркестратора 17.09 при приёмке `D39.266` | | 498 | ⛔⛔ **`prompt_override` НЕ СПРАШИВАЕТ ПРО ПАРУ, И ВСЕ ЧЕТЫРЕ БОЕВЫХ КОНФИГА УЖЕ НАЦЕЛЕНЫ НА `zh-ru` ⇒ АНГЛИЙСКАЯ КНИГА ПОЕДЕТ КИТАЙСКИМ ПРОМТОМ ПЕРЕВОДЧИКА МОЛЧА.** Конвенционный путь `//.md` падает ГРОМКО на отсутствующей паре именно затем, чтобы конвенции чужой пары не подставлялись тихо; `prompt_override` проверяет только ЧИТАЕМОСТЬ файла и про пару не спрашивает никогда. Замер с контролем (`tmctl manifest` на настоящей английской книге, `source_lang: en`): override на настоящий `backend/prompts/zh-ru/translator-banknote.md` → **`EXIT=0`**, конфиг грузится и в той же сводке печатает `en→ru`; контроль — override на несуществующий файл того же каталога → `EXIT=10` «prompt_override template … is not readable». ⇒ гард есть, но он про файл, а не про принадлежность. Зашито во ВСЕХ боевых: `backend/configs/pipeline-c1.yaml:77`, `backend/configs/pipeline-arm-glm.yaml:38`, `backend/configs/pipeline-arm-mistral.yaml:42` (все `../prompts/zh-ru/translator-banknote.md`), `backend/configs/pipeline-c2.yaml:43` (`../prompts/zh-ru/judge-selector.md`). ⛔ **Цена конкретна и она в КАЧЕСТВЕ, а не в падении:** английская книга получит промт, который велит «китайский 时辰 = 2 часа», «доля 成 — десятые» и требует банкнотную таблицу по китайским правилам. ⚠ Класс — «промт проверен НАЛИЧИЕМ файла, а не тем, чему он принадлежит»; это дверь, через которую возвращается латентный баг, ради которого конвенционный путь и сделан громким. **Обход данными существует** (своя пайплайн-копия книги с override на свою пару) и применён паком английской пары — но обход прячет цену: следующая пара наступит на то же и наступит молча. **Лечение:** override обязан лежать внутри каталога пары ЭТОЙ книги, иначе громкий отказ, называющий и путь, и пару; осознанный вариант роли (`editor-mono`, банкнота) этим не ломается — он и так в каталоге своей пары. ⚠ `PromptSHA256` берётся по СОДЕРЖИМОМУ, а не по пути ⇒ пере-снапшота правка не требует (предъявить замером до правки конфигов) | бэкенд | **скоро (БЛОКЕР ратификации готовности)** | ⚠ **ИСПР. 18.09 — ПРЕЖНИЙ КРИТЕРИЙ ОПИСЫВАЛ ФОРМУ, КОТОРУЮ МЫ ОТВЕРГЛИ, И ЗАКРЫВАТЬ РЯД ПО НЕМУ НЕЛЬЗЯ.** Он предписывал «гард отказывает на override вне каталога пары книги» — а это отменило бы **ратифицированное** свойство с живым пином `TestPromptOverrideIsPairAgnostic` (`backend/internal/config/prompt_pack_test.go:119`, гоняет три пары), чей докблок объявляет черновую стадию ЕДИНСТВЕННЫМ осознанным исключением из ролевой конвенции и говорит про ключ дословно «which is exactly what the convention keeps that key for». Сессия остановилась и пингнула вместо исполнения — по условию оркестратора, и условие окупилось: разрешение гарда было ошибкой оркестратора, не проверившего ратификацию. **НОВЫЙ КРИТЕРИЙ, по построенному:** ключ `prompt_variant` резолвит вариант роли ПО КОНВЕНЦИИ (`/<пара>/<роль>-<вариант>.md`) — достройка того, что данные уже используют именами `translator-banknote.md`/`editor-mono.md`; `prompt_override` сохраняет ратифицированное пар-агностичное значение и его пин **НЕ тронут ни строкой**; все четыре боевых конфига сняты с литерального `../prompts/zh-ru/…` и переведены на вариант; пин утверждает, что КАЖДАЯ стадия КАЖДОГО боевого конфига резолвится в каталог СВОЕЙ пары, считает по (конфиг, пара) и сообщает недобор числом; записи каталога с флагом `battery` | замер `textmachine-main-c5` 17.09 на английской книге, разрешение оркестратора | | 497 | ⛔ **ПИН КВАДРАТИЧНОСТИ ФЛЕЙКУЕТ НА ЗДОРОВОМ ДЕРЕВЕ И КРАСИТ ЧУЖОЙ ЛЕНДИНГ.** `TestEvidenceWindowsDoesNotGrowQUADRATICALLYWithTheBook` (`backend/internal/terminology/evidence_test.go:77`=`linear ≈4, quadratic ≈16`; размеры входа объявлены строками выше — `measure(2000)` и `measure(8000)`) утверждает ОТНОШЕНИЕ времён, и его докблок объясняет выбор так: «IT ASSERTS A RATIO, NOT A DURATION. A wall-clock threshold on a shared machine is a flake; the shape of the curve is the property». ⛔ **Посылка опровергнута замером: отношение защищает от РОВНОЙ нагрузки и слепо к её ИЗМЕНЕНИЮ между половинами.** Обе половины меряются ПОСЛЕДОВАТЕЛЬНО, а `go test ./...` гоняет пакеты параллельно — выросла контенция между малым и большим замером, и отношение раздулось, ничего об этом не сказав. ⚠ **Улика — два вердикта на ОДНОМ коммите `871e0af`:** приёмка оркестратора дала `MAKE_EXIT=0`, входная батарея следующей сессии — `MAKE_EXIT=2` с `ratio ×16.5` при пороге 16 (малый замер прошёл на 42.5 мс против изолированных 22, то есть уже вдвое медленнее). Изолированно пять прогонов оркестратора дают 4.3 · 4.3 · 3.1 · 4.6 · 5.7 — свойство ДЕРЖИТСЯ, негоден прибор. ⇒ **зелень приёмки была везением, а не замером**, и цена дефекта не в этом тесте, а в том, что он красит лендинг чужой зоны и заставляет её доказывать невиновность. **Форма лечения названа сессией:** мерить половины ВПЕРЕМЕЖКУ (A-B-A-B, брать медиану) либо нормировать на опорный замер той же секунды — тогда общая нагрузка сокращается по-настоящему, а не по предположению. ⚠ Родня ряда про «пин, флейковый на мутанте, измеряет пустой сценарий», но здесь хуже: флейк на ЗДОРОВОМ дереве ⚠ **ТРЕТИЙ СВИДЕТЕЛЬ 18.09:** на этом пине упала батарея сессии достижимости пар-данных, и нагрузку создавал ЕЁ ЖЕ ревью-агент — то есть пин красит лендинг от работы, которую ведёт сама сдающая сессия. ⇒ класс подтверждён третий раз за двое суток: **пин, утверждающий отношение времён, на общей машине меряет нагрузку вместе с предметом**, и «своя» нагрузка не отличается от чужой. | бэкенд | скоро | пин краснеет только на настоящей квадратичности: посадка «вернуть квадратичный `window()`» краснеет им, а десять прогонов полной батареи подряд — зелёные | найдено `textmachine-main-c5` на входной батарее 17.09, пере-снято оркестратором пятью изолированными прогонами | diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 214c6528..e3a07acb 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-18, голова D39.268 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **95** живых доков в `docs/` (⚠ испр. 17.09 вечером: стояло **98**, и это был ЛОЖНЫЙ литерал, а не потеря файлов — сверка дерева со срезом головы предписанной здесь же командой дала 95 в ОБЕИХ сторонах, ни одного файла не ушло и не пришло; ошибся сам пере-счёт, а прибор это число не сторожит и потому ложь прожила день. В 95 уже входит промт выдачи №14; пере-счёт после выноса каталога консилиума; прежние 97 разошлись с фактом 144 и это заметил ревизор, а не гейт) (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, **12** в `backend/docs`, **7** в `frontend/docs` (испр. 17.09: стояло 9) — ⚠ ⚠ испр. 11.09: из 97 ВРЕМЕННЫХ **три** (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 109 (major 0), всего рядов 469 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-18, голова D39.269 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **95** живых доков в `docs/` (⚠ испр. 17.09 вечером: стояло **98**, и это был ЛОЖНЫЙ литерал, а не потеря файлов — сверка дерева со срезом головы предписанной здесь же командой дала 95 в ОБЕИХ сторонах, ни одного файла не ушло и не пришло; ошибся сам пере-счёт, а прибор это число не сторожит и потому ложь прожила день. В 95 уже входит промт выдачи №14; пере-счёт после выноса каталога консилиума; прежние 97 разошлись с фактом 144 и это заметил ревизор, а не гейт) (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, **12** в `backend/docs`, **7** в `frontend/docs` (испр. 17.09: стояло 9) — ⚠ ⚠ испр. 11.09: из 97 ВРЕМЕННЫХ **три** (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 109 (major 0), всего рядов 469 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ⛔ **ПЯТЬ ПОТОКОВ РАБОТЫ — состояние на 07.09 (пере-снято лендингами смены №23).** > **(1) ПОЛИГОН — «ремонт прибора»** (`docs/POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md`, строки 319 · 300 · 265 · 143): > ⚠ **ЕДИНСТВЕННЫЙ ПОТОК, НЕ СДВИНУВШИЙСЯ ЗА СМЕНУ — сессия по промту так и не стартовала.** Блокирующая линза diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index ef522b41..5dcdf424 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.268; титул — носитель головы, бампать при каждом аппенде) +# Реестр D-нот — карта актуальности v2 (D1–D39.269; титул — носитель головы, бампать при каждом аппенде) > ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не > место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы, @@ -327,3 +327,4 @@ | D39.266 | 17.09 | **ПРИЁМКА БЭКЕНД-ПАКА «РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ»** — `d25e418`, 32 пути, $0. Решённая движком строка переживает покупку: носитель — таблица `bank_basis` (миграция v19, аддитивная, `memory_version` не двигает). РАТИФИЦИРОВАНЫ смена поведения (первый прогон после появления базиса платит ОДИН раз за переупаковку хвоста батчей: run1/run2 по `$0.001820`, run3/run4 по нулю) и пятая роль онтологии — ПАМЯТЬ РЕШЕНИЙ со второй петлёй защиты подписанного. Ряды: **490** закрыт по трём условиям (страж · живой путь · посадка), **130** получил ТРЕТИЙ исход — замысел достигнут другим механизмом, механизм ряда не построен намеренно, стоп-решение остаётся за владельцем, остаток сужен до двух предметов; **447** и сторож растущей книги — отказы с замером; заведён **496**. Числа приёмки сняты оркестратором: батарея `MAKE_EXIT=0` 24=24 при 11 названных скипах, пять корпусных тестов предъявлены исполнением, кампания **315/315 поймано, выживших 0, неизмеренных 0** с полнотой в обе стороны, M1 — **67 из 69** и **64 из 66** обслужено из памяти при верности реконструкции без расхождений. ⛔ Приёмка нашла в отчёте две дыры ОДНОГО класса — не неверное число, а отсутствующее утверждение (прибор, не названный прибором; заказанный ряд без исхода), и купила норму: **собственные проверки не находят отсутствующее, потому что знаменателем им служит свой же текст** ⇒ сверять перечень заказа по СПИСКУ ЗАКАЗЧИКА. ⚠ Шесть ошибок оркестратора названы в теле, включая два ложных ноля по `books/` от двух РАЗНЫХ приборов | приёмка | `docs/archive/prompts/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md` | | D39.267 | 18.09 | **ПРИЁМКА БЭКЕНД-ПАКА «АНГЛИЙСКАЯ ПАРА en→ru»** — `ddadb3e` (32 файла, 1356/127, $0) + `63e3a0d` (отчёт зоны). Кампания **327/327 поймано, 0 выживших, 0 НЕ ИЗМЕРЕНО**, сумма исходов = составу гейта, корень сверен с `ddadb3e:backend` после кампании (0 расхождений). Ратифицирована замена защиты, державшейся ОТСУТСТВИЕМ, на механизм: пакет пары убирал пустоту, из-за которой английская книга отказывалась, и книга поехала бы китайским промтом молча. Веер 57 находок, 9 — дефекты собственной работы зоны. Решение владельца «данные работают там, где явления нет» исполнено подъёмом правила до КЛАССА. Ряды 501·502·503 заведены, 499 переписан четвёртой редакцией. ⚠ Мои ошибки: выдал следующий пак в НЕосвобождённую зону (норма через «я» слепа к делегированию) и пять ложных нулей прибора | приёмка | | D39.268 | 18.09 | **ПРИЁМКА БЭКЕНД-ПАКА «ДОСТИЖИМОСТЬ ПАР-ДАННЫХ»** — `9defda4` (38 файлов, 1855/66, $0) + `e6f9a3b`. Кампания **336/336 поймано, 0 выживших, 0 НЕ ИЗМЕРЕНО**, сумма = составу гейта. ⭐ Предмет ПЕРЕ-ОПРЕДЕЛЁН замером до выдачи: языковых ветвлений в Go шесть при контроле 154 файла, живых два и оба законны ⇒ остаточная зависимость есть НЕДОСТИЖИМОСТЬ ДАННЫХ, а не грязь в коде. Ратифицированы условный фолд как ФОРМА (три условия, прецедент — пак заголовков) и пар-скоупный лейбл промта. Китайская половина неподвижна — доказано ВХОДАМИ (0 тронутых, 0 версий-констант), а не совпадением хешей. Два отказа зоны приняты с замером. Ряды 347 и 500 ЗАКРЫТЫ, 272 движковой половиной, 502 половиной, 303 не тронут. **Английская книга доезжает на боевом конфиге — вход прогона открыт** | приёмка | +| D39.269 | 18.09 | **ПРИЁМКА АДВЕРСАРИАЛЬНОГО КРУГА + РАТИФИКАЦИЯ ГОТОВНОСТИ К ХОЛОДНОМУ ПРОГОНУ** — `dca0e06` (20 файлов, 1188/247, $0) + `2a2ba4a`. Кампания **346/346, 0 выживших, 0 НЕ ИЗМЕРЕНО**, третья подряд начисто (327/336/346). ⛔ Починка САМА внесла блокер: посылка «такова форма, которую производит ингест» ложна — 68 прогонов из 4842 ломались, батарея при этом зелена, а посадка фиксировала дефект как норму; закрыто дифференциальным замером (ноль расходящихся абзацев из 11 404). **ГОТОВНОСТЬ РАТИФИЦИРОВАНА** с явным перечнем того, чего акт НЕ утверждает (платформа — на служебной базе; хостовое — предстартовые условия; «доезжает» ≠ «переводится»). Платформа: полная батарея, 0 пропусков — но путь к числу важнее: зелень при 487 пропусках была ничем. Деньги: $4 есть ОСТАТОК, потолки ниже него, размер за владельцем | приёмка+ратификация | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 699a0cd7..3e9412de 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.268 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.269 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 — в слайсе `../archive/architecture/05-decisions-D39-106-123.md` (испр. 05.09: прежнее «живёт ниже в этом файле» протухло подрезкой D39.139) (голова D39.106+). @@ -4916,3 +4916,113 @@ env-гейченных прибора вместо одного: две проб а описание разметки было прямо ложным («курсивные абзацы» при нуле таковых). Контроль ссылок на закрываемые ряды сперва дал ноль по форме «строка N», которой проект не пользуется, — **негодный контроль доказывает что угодно**, пере-снял формой «ряд N» и получил 7 и 1. + +## D39.269 — ПРИЁМКА АДВЕРСАРИАЛЬНОГО КРУГА И РАТИФИКАЦИЯ ГОТОВНОСТИ К ХОЛОДНОМУ ПРОГОНУ (18.09) ✅ + +### A. ПРИЁМКА + +**A1. Что заландено.** `dca0e06` — **20 файлов, 1188 вставок, 247 удалений, $0**; отдельным коммитом +`2a2ba4a` отчёт зоны (146 вставок, 0 удалений). Круг проведён зоной по требованию владельца — адверсариальный +проход по СОБСТВЕННОЙ сданной работе — и нашёл в ней настоящие дефекты. + +**A2. Числа, прибор назван у каждого.** Мой: кампания на замороженном корне (отпечаток `cb1e2b042db7db8d`) — +**346 поймано, 0 выживших, 0 НЕ ИЗМЕРЕНО**, `MUT_EXIT=0`, сумма исходов **равна составу гейта**; третий класс +молчит (`premise` · `connection reset` · `not green` — по нулю); копия после кампании байт-идентична дереву, и +дерево во время неё стояло. Зоны: батарея `MAKE_EXIT=0`, 24 пакета против 24 вердиктов, встречная сверка пуста +в обе стороны, скипов 6 поимённо; каталог 547 → 557, в гейте 336 → 346, все новые с флагом. + +**A3. ГЛАВНОЕ: ПОЧИНКА САМА ВНЕСЛА БЛОКЕР, И НАШЛА ЕГО ЗОНА, А НЕ ПРИЁМКА.** Правило против инверсии +выделения опиралось на посылку «открывающий маркер не стоит после буквы — такова форма, которую производит +ингест». Посылка **ложна**: замер по выходу самого ингеста дал **68 прогонов из 4842**, где маркер открывается +после буквы или знака препинания. Правило отвергало их как открывающие ⇒ **воспроизводило ровно ту инверсию, +ради запрета которой писалось**: 68 потерянных выделений, 136 звёздочек наружу, 67 абзацев иначе — в файле, +который открывает читатель. ⛔ Три свойства делали это невидимым: батарея зелёная (порча в СОДЕРЖАНИИ, не в +валидности) · собственный новый пин держал постоянной ровно ломающуюся форму · посадка под починку +**фиксировала сломанное поведение как норму**, то есть гейт защищал дефект. +**Закрыто замером:** правило опирается только на то, что модуль гарантирует ПО ПОСТРОЕНИЮ; дифференциальный +контроль на боевой книге — **4842 выделения из 4842, ноль звёздочек наружу, НОЛЬ расходящихся абзацев из +11 404**, то есть на книге со сбалансированными маркерами правило прозрачно байт-в-байт. Пин пере-написан +теми формами, на которых ломалось; предел записан в самом тесте. + +**A4. Шесть прочих находок круга.** Починка метаданных книги оказалась **ИНЕРТНОЙ** (глифы присваиваются +после того, кто их читает) · гейт «пара учит свой глиф промтам» был **ПУСТЫМ** — удовлетворялся обычным +маркдаун-буллетом, что доказано вырезанием всего объяснения при зелёном результате · гейт файлов пака не ловил +верное имя не в том каталоге · разбор стилей бросал остаток на скобке в строковом литерале (регресс против +прежнего кода) · условие блочного исключения названо · стоимость предиката записана наблюдением. + +**A5. Честность зоны, которую надо назвать отдельно.** Первый прогон её мутаций дал **1 выжившую и 1 +неизмеренную**, и она их не спрятала: выжившей оказался её собственный ПУСТОЙ пин — он утверждал то, что и +так делают байты файла. Предыдущий прогон гейта умер **на линтере, до единого теста**, вердиктов ноль, и +поймала это сверка полноты списком, а не чтение хвоста. +⚠ **И её ошибка, стоившая часа машинного времени:** слово «работа завершена» было дано **по памяти о +сделанном**, а сверка со списком нашла два пункта, которые считались исполненными и не были. Дерево двинулось +после слова, кампания обесценилась. Названо ею самой; в акте стои́т потому, что **числа обязаны называть +состояние, на котором сняты**, а состояние менялось трижды. + +**A6. Решение владельца исполнено в данных.** Родовая директива: ратифицирована трижды, одна нота объявила её +исполненной — а в данных стояла прежняя. Исполнена **отдельной осью**: ключ манифеста сдвинут заявленно +(`EmbeddedVersion`), маскированный структурный дифф голденов пуст, содержательный токен диффа один. +⛔ **И то, что объясняет, как решение простояло неисполненным: ни один голден не рендерит эту директиву +вовсе.** «Дифф пуст» означало не «строка не изменилась», а «строку не видит ни одна фикстура». Стерегущий её +тест проверял только первые слова и мужской дефолт пропустил бы; усилен. + +### B. РАТИФИКАЦИЯ ГОТОВНОСТИ + +**B1. ДВИЖОК ГОТОВ, и вот чем это предъявлено.** Три полные мутационные кампании подряд на трёх замороженных +состояниях: **327/327 · 336/336 · 346/346**, выживших 0, неизмеренных 0, сумма исходов равна составу гейта в +каждой. **Английская книга доезжает на БОЕВОМ конфиге** без единой его правки и встаёт на денежном потолке +книги ДО первого вызова — `TOTAL $0.000000`, ноль обращений к провайдеру. **Китайская половина неподвижна**, и +это доказано ВХОДАМИ: тронутых входов, сворачивающихся в ключ манифеста, ноль (кроме заявленной оси родовой +директивы), и ноль правок у безусловных версий-констант. + +**B2. ПЛАТФОРМА ГОТОВА, но утверждение здесь СЛАБЕЕ, и разница названа.** Полная батарея зоны: +`CHECK_EXIT=0`, 20 пакетов, FAIL 0, **пропусков 0**, и гейт сам напечатал «отработал каждый тест, ни одного +условия хоста не недоставало». ⛔ **Путь к этому числу важнее его самого:** гейт сперва не запускался вовсе +(инструмент на диске, но не в PATH), затем был зелен **при 487 пропущенных тестах**, затем красен от МОЕЙ +фикстуры с мёртвыми путями, и только четвёртый замер честен. **Расстояние между «гейт зелен» и «зона +проверена» равнялось 487 тестам, и прибор не соврал ни разу.** +⚠ **Асимметрия двух зон записывается, а не сглаживается:** у движка есть гейт ЧУВСТВИТЕЛЬНОСТИ (доказано, что +тесты ловят порчу); у платформы — «не сломано» плюс каталог ОДНОГО пака (25 из 26). Это разные утверждения, и +акт не выдаёт одно за другое. + +**B3. ЧЕГО ЭТОТ АКТ НЕ УТВЕРЖДАЕТ — перечислено нарочно.** +(а) **не** «платформа проверена» — только «батарея зелена на СЛУЖЕБНОЙ базе с фикстурами»; боевой стенд +прогона не поднимался ни разу; (б) **не** «готовность есть» безусловно — ратифицируется состояние ДЕРЕВА; +хостовая готовность делегирована фазе 0; (в) **не** «английская книга переводится» — измерено, что она +ДОЕЗЖАЕТ до денежного потолка; (г) **не** «консистентность на английском работает» — банк-контур ДОСТИЖИМ, +но платно на английских кандидатах не вызывался ни разу; (д) **не** «детектор латиницы починен» — он +по-прежнему ASCII-слеп к диакритике, вынут из пака замером (на прогоне не меняет ничего, что видит модель, а +бамп версии двигает снапшот обеих книг); (е) **не** «поведение модели на маркерах известно» — цепь измерена, +поведение модели нет. + +**B4. Хостовое отделено от древесного, и это несущее различение.** Всё, что чинилось руками сегодня — путь к +инструменту, служебная база, шаблон с мёртвыми путями, — свойства МАШИНЫ. Их нет в репозитории, они умрут с +окружением, и сессия прогона встретит их заново. ⇒ они идут **предстартовыми условиями** пака прогона, а не +выполненной работой. Список условий ОДИН и живёт в паке; акт на него ссылается и не заводит второго. +⛔ **Первый платный вызов гейтится напечатанной уликой фазы 0, а не этим актом.** + +**B5. ДЕНЬГИ — решение владельца и решение оркестратора.** Владелец 18.09: «Это остаток на счету», и затем +«Пополнять не буду, должно хватить». ⇒ **размер прогона остаётся владельческим (около 20 глав), а защита — +оркестраторской:** сумма КНИЖНЫХ потолков ставится заведомо ниже остатка, чтобы прогон встал на НАШЕМ потолке +— штатной остановкой с понятной причиной, — а не упёрся в провайдера, у которого программного исхода нет +(ряд **502**, закрыт половиной). ⛔ **Дневной потолок в шаблон книги не кладётся ни при каком раскладе.** +⚠ **Моя смета была груба, и это исправлено:** я делил всю цену прогона A на три главы, а в ней 15.6 % +книго-широкого терминологического контура, который с числом глав линейно не растёт. Поглавная часть — +$0.11804, а не $0.13981; честный диапазон на двадцать глав обеих книг **$3.6 … $6.4**. ⇒ спор о том, хватит +ли остатка, решается не аргументом, а **проекцией движка за $0 перед первым центом**. + +**B6. Названный остаток — не закрыт и не спрятан.** Ряд **283** (64 осколка оглавления в английской книге, +$0.38 из $6.65) измерен, не починен · **303** не тронут, и потому английская книга не получает +детерминированного заголовка главы · **502** половина · **503** (забор ре-пина пускает одну ось) отложен мною +ДО прогона сознательно: путь денежно-критичный, а ошибка в нём даёт исход хуже нынешнего · **504** разобран по +механизму (фиксированный сон против планировщика), не починен · **410** голос не построен · **412** и +платформенная половина **272** — док-долг. + +**B7. МОИ ОШИБКИ.** Выдал пак в НЕосвобождённую зону (слот освобождается актом, а не сдачей) — поймала зона. +Испортил шапку журнала решений незакавыченным heredoc, который ИСПОЛНИЛ текст вместо записи — поймал по +выводу, починил, проверил счётом. В акте `D39.268` назвал митигацию лечением — эррата 18.09-а. Завёл ряд с +ложным оправданием зоны — поймал до лендинга. **Семь ложных нулей и ложных тревог за смену, все от +собственных приборов:** греп по имени теста · знаки против байтов · своя командная строка в счётчике +процессов · `find` на относительном времени · копия под идущим мутатором · `awk`-диапазон по телу ноты · +пофайльный `diff` по пути без префикса каталога. ⭐ Формулировка зоны, накрывающая класс: **оба прибора +честны, и именно поэтому расхождение читается как порча данных, а не как разные вопросы.**