diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 28e3def2..52b8873e 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -399,7 +399,7 @@ | 488 | ⛔ **ТЕСТ ГЕЙТА ГРУЗИТ ВЕСЬ МОДУЛЬ С СИНТАКСИСОМ И ТИПАМИ — 1.44 ГБ БЕЗ `-race`, 3.2 ГБ С НИМ, И РАСТЁТ ВМЕСТЕ С РЕПОЗИТОРИЕМ.** `backend/internal/archguard/shippingtree_test.go:34`=`Mode: packages.LoadAllSyntax, Tests: true` грузит `textmachine/backend/...` целиком ⇒ его память пропорциональна размеру РЕПО, а не предмету теста. Замерено зоной 17.09 после ТРЁХ убийств гейта подряд; пере-снято оркестратором чтением (`LoadAllSyntax` 1 хит, `Tests: true` 1 хит в пакете). ⭐ **ПРИЧИНА УТОЧНЕНА 17.09 ТРЕТЬИМ НЕЗАВИСИМЫМ ЗАМЕРОМ, и прежняя редакция ряда читалась опаснее правды: бьёт СУПЕРВИЗОР ФОНОВЫХ ЗАДАЧ ХАРНЕССА, а ПЕРЕДНИЙ ПЛАН ему не подчиняется.** Та же команда с теми же флагами в переднем плане проходит: `go test ./internal/archguard/ -race -count=1 -timeout=20m` → `ok 29.048s`, пик **3 418 648 kB (3.26 ГБ)**, совпавший с показанием семплера ДО КИЛОБАЙТА. ⇒ гейт в машину ПОМЕЩАЕТСЯ; не помещается он в фоновую задачу. Умерли ПЯТЬ версий причины (конкуренция наборов · параллелизм `-p` · тяжесть пакета конвейера · потолок cgroup · нехватка памяти машины), живёт одна. ⚠ Следствие для приёмок: «гнать гейт, когда рядом нет второго тяжёлого прогона» — НЕ лечение, а суеверие; лечение — гнать не в фоне. ⭐ **ВТОРАЯ УЛИКА 17.09, приёмочная: потолок фоновых задач НЕ ОДИНАКОВ У СЕССИЙ.** У зоны `make battery` целиком не прошёл ЧЕТЫРЕ раза (включая попытку на пустой машине); у оркестратора тот же гейт на копии того же дерева прошёл ЦЕЛИКОМ и В ФОНЕ с первого раза, при `MemFree` **0.5 ГБ** на старте — то есть в ХУДШИХ условиях по свободной памяти. ⇒ «гейт не помещается в машину» неверно даже как описание: он не помещается в ЧУЖУЮ фоновую задачу, и чья именно сессия его запускает — несущий параметр, а не деталь. ⛔ **Убивает не нехватка памяти и не потолок cgroup:** `memory.max = max` у обоих слайсов, `MemAvailable` держался ≈4.2 ГБ — падал **`MemFree`, до 110 МБ**, и супервизор бьёт по НЕМУ. ⇒ «свободных четыре гигабайта» ничего не гарантирует, и это практическое знание для всех зон, а не частность движка. ⭐ **Три версии причины, выдвинутые до замера, оказались ЛОЖНЫМИ, и это стоит держать видимым:** «конкуренция наборов» (убило в одиночку) · «параллелизм пакетов» (убило с `-p=2`) · «тяжёлый `internal/pipeline`» (замер: пик 313 МБ под `-race`). ⚠ **И контроль A/B едва не обманул в ОБРАТНУЮ сторону:** первая попытка шла с `-run TestShipping`, вернула `ok … [no tests to run]` и 126 МБ; прими зона этот «дешёвый базис» за `HEAD`, вышел бы вывод «пак утроил память» — из контроля, который НЕ ЗАПУСКАЛСЯ. Настоящее имя — `TestInvariantsHoldInTheShippingTree`. Честное A/B: чистый `HEAD` 1.44 ГБ против рабочего дерева 1.44 ГБ, разница **+0.3 %** ⇒ дефект НЕ от пака. ⚠ Границы: в батарейное подмножество каталога мутаций `archguard` НЕ входит (пере-снято оркестратором: 0 упоминаний при 491 записи и 280 в батарее), поэтому кампанию он не трогает — страдает только `make battery`. Родня — ряд **484** (ратифицированный рецепт, не помещающийся в машину, на которой его требуют гонять) | бэкенд | скоро | тест судит инварианты, не загружая весь модуль, либо гейт объявляет свою потребность в памяти и условие, при котором не запускается | замер зоны 17.09, контроли оркестратора | | 489 | ⚠ **РЕВИЗИЯ ДОКУМЕНТАЦИИ ЗОНЫ БЭКЕНДА (пинг оркестратора №22 от 04.09, 10 пунктов) ЖИВА НА ТРИНАДЦАТЫЙ ДЕНЬ — пере-снято 17.09 приборами, а не перечитыванием.** Пинг сидит семьюдесятью строками в журнале прогресса и адресован ЗОНЕ, которой сейчас нет (слот свободен), поэтому живое уезжает сюда прежде, чем носитель будет свёрнут (условие владельца `D39.261` п.2). **ИЗМЕРЕНО ЧЕТЫРЕ ЖИВЫХ:** (1) `backend/README.md` описывает инвариант канала через ключи, которые ЗАГРУЗКА ОТВЕРГАЕТ — «permissive» 1 хит, а настоящий механизм (метки контента против принимаемых меток) **0 хитов**; (2) оба PUML (`components.puml`, `pipeline.puml`) БЕЗ предупреждающего баннера в шапке, при том что карта доков подаёт их как текущие; (6) ⛔ **тяжелейший: ратифицированная норма зоны висит на ЗАКРЫТОЙ строке** — `backend/docs/DISCLOSURE_LAW_DESIGN.md:219-221` обусловливает себя словами «пока строка бэклога 246 открыта», и сам текст обещает «закроется 246 — оговорка снимается вместе с ней», НО ряд 246 закрыт лендингом (в таблице его нет, журнал решений подтверждает) ⇒ оговорка действует без предмета; (10) пакет `backend/internal/langscreen` существует и лежит на денежном пути вердиктов, а в README о нём **0 упоминаний**. ✅ **ИЗМЕРЕНО ЗАКРЫТЫМ ОДНО:** (7) «семь протухших токен-якорей в `backend/docs/`» — красных якорей с целью в этом каталоге **0** при 327 адресах. ⚠ **НЕ ИЗМЕРЕНО ПЯТЬ** (3 · 4 · 5 · 8 · 9): они про содержание прозы README и требуют чтения, а не грепа; «не измерено» здесь значит именно это, а не «исполнено». ⛔ Правит ЗОНА: `backend/` мне писать нельзя, и тринадцать дней простоя — следствие того, что пинг жил в журнале, а не строкой трекера. Нести в промт следующего бэкенд-пака | бэкенд | скоро | четыре живых пункта исполнены или названы неисполнимыми, пять неизмеренных измерены | пинг №22 04.09, замеры оркестратора 17.09 | | 490 | **РАЗРЫВ ОКОН ГЛАВ У БАНКОВЫХ СТРОК НЕ ПРОВЕРЯЕТ НИКТО — страж построен только для ГОЛОСОВ.** Загрузчик отбивает ПЕРЕСЕЧЕНИЕ окон и полисемию (`backend/internal/membank/memseed.go:201-236`), а РАЗРЫВ — `until_ch=3` при следующем `since_ch=5`, то есть глава 4 без закона — не ловится ничем. Готовый образец лежит рядом и построен для другой сущности: `backend/internal/membank/memvoice.go:271`=`func VoiceWindowGaps`, и его докблок объявляет разрыв у голосов ЗАКОННЫМ намеренно (`backend/internal/membank/memvoice.go:268`=`a deliberate gap`), поэтому он логирует, а не роняет. ⚠ **Контроль области напечатан, потому что отрицательный замер без него неотличим от непрочитанного:** в не-тестовых `.go` каталога `membank` — 11 совпадений `windowsOverlap` и 7 хитов `gap` ВНЕ голосов, и все семь про пропуски склонений в пост-чеке, то есть о другом предмете; стража разрыва у банковых строк среди них нет. ⛔ **Чем это стоит качества перевода:** преемник термина собирается тремя отдельными решениями владельца, и опечатка в границе оставляет главу без закона МОЛЧА — редактор переводит её без банка, а замечает это уже читатель книги. Проверка живёт над тем же документом решений: глаголов не добавляет, `DecisionsVersion` не двигает, контракт не трогает — $0. ⚠ Беря у образца форму, взять и его гарантию: намеренный разрыв законен и в сид-файле невидим, поэтому исход — громкая строка оператору, а не отказ загрузки | бэкенд | скоро | разрыв окон у банковых строк называется оператору тем же способом, что у голосов, и запинен посадкой, которая краснеет именно им | `research/35` N-7, замеры оркестратора 17.09 | -| 491 | **УЛИКА ПЕРЕЗАГРУЗКИ ХОСТА СУЩЕСТВУЕТ И НЕ ЧИТАЕТСЯ ЗОНОЙ ВОВСЕ — различие «ребут» против «ручной остановки» сегодня ВЫВОДИТСЯ, хотя могло бы быть ФАКТОМ.** Платформа решает судьбу прогона, вышедшего с кодом остановки без записанного намерения, предположением о причине (`platform/internal/runs/reconcile.go:573`=`interruptedBySomeoneElse(l, marker)`), и тот же файл честно говорит, что смысл ОТСУТСТВИЯ записи решается уровнем выше. ⚠ **Замер оркестратора 17.09 (знаменатель напечатан, потому что это отрицательный замер):** имена `btime` · `boot_id` · `BootID` · `InvocationID` · `uptime` дают **по 0 хитов** в не-тестовых `.go` платформы при **88** прочитанных файлах; при этом улика на хосте есть и читается — `/proc/stat` несёт время старта системы, `boot_id` доступен. ⇒ различить перезагрузку от ручной остановки можно было бы фактом, а не асимметрией цен. ⛔ **Почему это НЕ взято в пак 17.09 и довод сильный (сессия зоны, выдача №15):** ошибка в сторону «ребута не было» возвращает дефект на ВЕСЬ хост — терминирование пользовательского менеджера мимо перезагрузки прочиталось бы как ручной стоп и убило бы все прогоны разом, — а выигрыш совпадает с тем, что уже даёт предел перезапусков ряда 398. ⇒ строка заводится, чтобы довод не растворился вместе с отчётом пака, и оживает, если предел окажется недостаточным или если появится второй хост | платформа | когда-нибудь (гейт: предел ряда 398 построен и оказался недостаточен, либо второй хост) | различие ребут/ручная остановка опирается на улику хоста, а не на вывод из кода выхода | замер оркестратора 17.09, довод сессии `textmachine-main-78` | +| 491 | **УЛИКА ПЕРЕЗАГРУЗКИ ХОСТА СУЩЕСТВУЕТ И НЕ ЧИТАЕТСЯ ЗОНОЙ ВОВСЕ — различие «ребут» против «ручной остановки» сегодня ВЫВОДИТСЯ, хотя могло бы быть ФАКТОМ.** Платформа решает судьбу прогона, вышедшего с кодом остановки без записанного намерения, предположением о причине (`platform/internal/runs/reconcile.go:598`=`interruptedBySomeoneElse(l, marker)`), и тот же файл честно говорит, что смысл ОТСУТСТВИЯ записи решается уровнем выше. ⚠ **Замер оркестратора 17.09 (знаменатель напечатан, потому что это отрицательный замер):** имена `btime` · `boot_id` · `BootID` · `InvocationID` · `uptime` дают **по 0 хитов** в не-тестовых `.go` платформы при **88** прочитанных файлах; при этом улика на хосте есть и читается — `/proc/stat` несёт время старта системы, `boot_id` доступен. ⇒ различить перезагрузку от ручной остановки можно было бы фактом, а не асимметрией цен. ⛔ **Почему это НЕ взято в пак 17.09 и довод сильный (сессия зоны, выдача №15):** ошибка в сторону «ребута не было» возвращает дефект на ВЕСЬ хост — терминирование пользовательского менеджера мимо перезагрузки прочиталось бы как ручной стоп и убило бы все прогоны разом, — а выигрыш совпадает с тем, что уже даёт предел перезапусков ряда 398. ⇒ строка заводится, чтобы довод не растворился вместе с отчётом пака, и оживает, если предел окажется недостаточным или если появится второй хост | платформа | когда-нибудь (гейт: предел ряда 398 построен и оказался недостаточен, либо второй хост) | различие ребут/ручная остановка опирается на улику хоста, а не на вывод из кода выхода | замер оркестратора 17.09, довод сессии `textmachine-main-78` | | 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, пере-снято оркестратором | diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 29b72410..bb60ff2c 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -78,7 +78,7 @@ > - ⚠ **Норма приёмки, купленная аудитом D39.167 п.1:** акт лендинга, объявивший закрытие строки регистра или бэклога, обязан быть СВЕРЕН СТАТУСОМ в тот же заход — иначе следующий пак собирается ПО РЕГИСТРУ и едет чинить построенное. Машинная половина — строка бэклога **225**. > - ⚠ **ЛЕНТА КОНТРАКТНЫХ МИНОРОВ** (что принёс каждый — телом ноты): **0.5.0** — D39.161 · **0.6.0** — D39.162/D39.163 · **0.7.0** — D39.166 · **0.8.0** — D39.169 · **0.9.0** — D39.180 · **0.10.0** — D39.194 (дверь выдачи: `downloadExport`, `failure_code` словарём, `Export.url` относительный; ⚠ читать с эрратой 04.09-в — минор был ратифицирован без своей кодовой половины и сутки жил ложным на проводе). Прожитые дампы приёмок P9/P10 — `archive/PROGRESS-2026-08-backend.md` и тела нот. > - **ЖИВОЕ:** полигон — **фаза Д ИДЁТ** (заказ 10.08; деньги санкционированы 15.08 напрямую полигону — ⚠ числа потолка в носителях расходятся, фактическую цепь сверить при лендинге петель; ja-книга `enkan_no_hate_ja`; при ратификации фазы Д в D-ноту: декой-правило + обязательный кросс-семейный опровергатель приёмки — одобрены 10.08; свежие фриз-коммиты полигона в дереве — НЕ трогать) · платформа и контракт — статус в строке выше, здесь НЕ дублируется (один носитель на факт) · **фронт ЗАМОРОЖЕН** (D39.136 п.2 + **D39.147: морозится ДАЛЬШЕ лендинга P7 — слово владельца 17.08; P7 зону НЕ размораживает, S5-промт не выдаётся, разморозка отдельным словом по достижении сквозного пути**; перечень первого касания зоны — синк зеркала на ТЕКУЩИЙ канон (отставание и его цена — п.6 очереди выше и строка бэклога 183(б)) + перегенерация типов + моки + гейт утечки конвейера + ФС-1..12 + Ф-63/Ф-28 + фразы В-11 по словарю кодов — не отменён, ждёт разморозки) · закрытые стройки эры — реестром нот `architecture/05-decisions-index.md` (D39.130–137, одна строка на ноту). -> - **Открыто на владельце:** ⚠ **НОВОЕ 06.09: второй круг селф-ревью** — бэкенд-сессия передала слово владельца «после сдачи обязателен селф-ревью, и если он дал исправления — НОВЫЙ круг, проверяющий исполнением и исходный заказ, и закрытие находок предыдущего круга». Первую половину того же слова (комментарии) он подтвердил как РЕКОМЕНДАЦИЮ, про вторую не сказал ничего; в мандате самопроверки `CLAUDE.md` сегодня описан ОДИН круг. Сессии исполняют добровольно, каноном не стало. ⭐ **УЛИКА В ПОЛЬЗУ ПРАВИЛА, снятая в ту же ночь 07.09:** круг 2 бэкенд-сессии опроверг ЕЁ ЖЕ правку круга 1 — свёртка сравнения через `NormalizeSourceKey` вводила ЛОЖНООТРИЦАНИЕ (замер зоны: `ReplaceGlossary(族長 + 族长)` → `rows stored=2`, контроль на байт-равном `src` → `UNIQUE constraint failed`, то есть UNIQUE стоит на СЫРОМ `src` и обе строки инжектятся), и мутация «свернуть сравнение» до круга 2 ПЕРЕЖИВАЛА весь пакет. Один круг сдал бы тихо-зелёное. · ✅ **Развилка строки 291 ЗАКРЫТА владельцем 05.09 — `D39.204`:** отказ резервации на ретрае деградирует во ФЛАГ («пусть флагает просто как-то»); вариант «минимальная покупка ≥ `step_max_usd`» снят. ⚠ Это оказалось НЕ сменой канона: D2 уже кончается флагом, денежная ветка до него не доходит. · ✅ **Лестница D25.1 ЗАКРЫТА владельцем 05.09 — `D39.205`:** копия БЕЗ пометки = книга БЕЗ ЕДИНОГО ПРОПУСКА; любой пропуск ⇒ пометка в файле, гранулярность — ЮНИТ (пропущенный кусок главы критичен). Имя файла решено паком `7e2226a` (вычисляется при скачивании). ⚠ Прежняя редакция держала это открытым на владельце — по ней он и получил вопрос, который сам уже закрыл · лейбл главы без заголовка (сейчас цифры; словесный шаблон = одна строка `reader.txt` после ратификации К-3) (⚠ три вопроса пака ЗАКРЫТЫ словом владельца 30.08: экспорт юзеру — всегда строить, см. п.4 очереди · модель пометок подтверждена как построена — надпись о пропуске в файле, отдельный варнинг-слой в интерфейсе НЕ строим, машинный отчёт сборки остаётся внутренним носителем (дрейф) · RTL — снят до появления право-налевой целевой пары) · ⚠ **ПЛАТФОРМЕННЫЙ ЛИСТ ЗАКРЫТ СЛОВОМ ВЛАДЕЛЬЦА 30.08 — четыре ответа и их следствия ЦЕЛИКОМ телом D39.176** (квот нет · продажа не в бете · продолжение после пополнения — руками · фразы пользователя делегированы проекту с требованием интернациональности). ⚠ **Лист ПУСТ:** последний его пункт (`PD-421`, «держит ли открытый поток сессию живой») СНЯТ замером 30.08 — окно бездействия сессии **14 суток**, абсолютный срок **30** (`platform/internal/config/config.go:346`=`defaultSessionIdle`), скольжение окна идёт на любом аутентифицированном запросе, а поток теряется лишь после того, как подметён протухший ряд, то есть после ДВУХ НЕДЕЛЬ без единого действия пользователя. ⚠ Часовой интервал в этой теме — периодичность УБОРКИ, а не срок сессии (эррата 30.08-а к D39.176 п.5) · ⚠ Гейт словаря фраз — строка **204** (D39.176 п.4). ⚠ Прежний указатель «строка 148» мёртв — строку удалил `a023e39` решением владельца, восстанавливать Приложение А по ней НЕ надо · **развязка git с origin** (локальная линия ИСТИННА, force-push его рукой; не пуллить) · В-4/Ф-30 (глава без заголовка — движковая половина строка 160) · мини-проба флора 44 (одобрена, промт не выдан; число — после ре-пробы 188) · ~~подпись денежного шага 46~~ (ратифицирована D39.190 п.4: пере-снапшот батча — единым актом, цена сегодня $0) · **схема time-based DeepSeek** — рекомендация и её доводы строкой **172**(а) · **вход ратификации фазы Д:** посылка «dspro дешевле glm» в пике ПЕРЕВЁРНУТА (×1.26 дороже, D39.137 п.4) · **возражение Sol по проходу `tier` эксп-23** (довод дословно — слайс `archive/PROGRESS-2026-08-10-15.md`: Sol судил СВОЁ семейство, что запрещено D13.3; подтвердить или снять — при лендинге петель фазы Д) · фронт-вопросы зонного журнала: В-7 (плотность; держит Ф-54) · В-8 (слово состояния в дереве) · В-9 (языки интерфейса — механизм готов, ПТ-36) · Ф-38 (вкладка «Замечания»). Закрытые пункты листа — в нотах D39.136–145, здесь не держатся. +> - **Открыто на владельце:** ⚠ **НОВОЕ 06.09: второй круг селф-ревью** — бэкенд-сессия передала слово владельца «после сдачи обязателен селф-ревью, и если он дал исправления — НОВЫЙ круг, проверяющий исполнением и исходный заказ, и закрытие находок предыдущего круга». Первую половину того же слова (комментарии) он подтвердил как РЕКОМЕНДАЦИЮ, про вторую не сказал ничего; в мандате самопроверки `CLAUDE.md` сегодня описан ОДИН круг. Сессии исполняют добровольно, каноном не стало. ⭐ **УЛИКА В ПОЛЬЗУ ПРАВИЛА, снятая в ту же ночь 07.09:** круг 2 бэкенд-сессии опроверг ЕЁ ЖЕ правку круга 1 — свёртка сравнения через `NormalizeSourceKey` вводила ЛОЖНООТРИЦАНИЕ (замер зоны: `ReplaceGlossary(族長 + 族长)` → `rows stored=2`, контроль на байт-равном `src` → `UNIQUE constraint failed`, то есть UNIQUE стоит на СЫРОМ `src` и обе строки инжектятся), и мутация «свернуть сравнение» до круга 2 ПЕРЕЖИВАЛА весь пакет. Один круг сдал бы тихо-зелёное. · ✅ **Развилка строки 291 ЗАКРЫТА владельцем 05.09 — `D39.204`:** отказ резервации на ретрае деградирует во ФЛАГ («пусть флагает просто как-то»); вариант «минимальная покупка ≥ `step_max_usd`» снят. ⚠ Это оказалось НЕ сменой канона: D2 уже кончается флагом, денежная ветка до него не доходит. · ✅ **Лестница D25.1 ЗАКРЫТА владельцем 05.09 — `D39.205`:** копия БЕЗ пометки = книга БЕЗ ЕДИНОГО ПРОПУСКА; любой пропуск ⇒ пометка в файле, гранулярность — ЮНИТ (пропущенный кусок главы критичен). Имя файла решено паком `7e2226a` (вычисляется при скачивании). ⚠ Прежняя редакция держала это открытым на владельце — по ней он и получил вопрос, который сам уже закрыл · лейбл главы без заголовка (сейчас цифры; словесный шаблон = одна строка `reader.txt` после ратификации К-3) (⚠ три вопроса пака ЗАКРЫТЫ словом владельца 30.08: экспорт юзеру — всегда строить, см. п.4 очереди · модель пометок подтверждена как построена — надпись о пропуске в файле, отдельный варнинг-слой в интерфейсе НЕ строим, машинный отчёт сборки остаётся внутренним носителем (дрейф) · RTL — снят до появления право-налевой целевой пары) · ⚠ **ПЛАТФОРМЕННЫЙ ЛИСТ ЗАКРЫТ СЛОВОМ ВЛАДЕЛЬЦА 30.08 — четыре ответа и их следствия ЦЕЛИКОМ телом D39.176** (квот нет · продажа не в бете · продолжение после пополнения — руками · фразы пользователя делегированы проекту с требованием интернациональности). ⚠ **Лист ПУСТ:** последний его пункт (`PD-421`, «держит ли открытый поток сессию живой») СНЯТ замером 30.08 — окно бездействия сессии **14 суток**, абсолютный срок **30** (`platform/internal/config/config.go:456`=`defaultSessionIdle`), скольжение окна идёт на любом аутентифицированном запросе, а поток теряется лишь после того, как подметён протухший ряд, то есть после ДВУХ НЕДЕЛЬ без единого действия пользователя. ⚠ Часовой интервал в этой теме — периодичность УБОРКИ, а не срок сессии (эррата 30.08-а к D39.176 п.5) · ⚠ Гейт словаря фраз — строка **204** (D39.176 п.4). ⚠ Прежний указатель «строка 148» мёртв — строку удалил `a023e39` решением владельца, восстанавливать Приложение А по ней НЕ надо · **развязка git с origin** (локальная линия ИСТИННА, force-push его рукой; не пуллить) · В-4/Ф-30 (глава без заголовка — движковая половина строка 160) · мини-проба флора 44 (одобрена, промт не выдан; число — после ре-пробы 188) · ~~подпись денежного шага 46~~ (ратифицирована D39.190 п.4: пере-снапшот батча — единым актом, цена сегодня $0) · **схема time-based DeepSeek** — рекомендация и её доводы строкой **172**(а) · **вход ратификации фазы Д:** посылка «dspro дешевле glm» в пике ПЕРЕВЁРНУТА (×1.26 дороже, D39.137 п.4) · **возражение Sol по проходу `tier` эксп-23** (довод дословно — слайс `archive/PROGRESS-2026-08-10-15.md`: Sol судил СВОЁ семейство, что запрещено D13.3; подтвердить или снять — при лендинге петель фазы Д) · фронт-вопросы зонного журнала: В-7 (плотность; держит Ф-54) · В-8 (слово состояния в дереве) · В-9 (языки интерфейса — механизм готов, ПТ-36) · Ф-38 (вкладка «Замечания»). Закрытые пункты листа — в нотах D39.136–145, здесь не держатся. > - **Сделано (сводно)** — снимок ленты закрытых эр в [archive/PROGRESS-2026-08-04-09.md](archive/PROGRESS-2026-08-04-09.md); детали — D-лог и слайсы. > - ⭐ **КУРС НА 04.09 — ПОРЯДОК РАБОТ, СОБРАННЫЙ ВЕЕРОМ ПО ВСЕМУ БЭКЛОГУ (31 агент, 46 кандидатов, шесть срезов + опровергатели + критик полноты).** ⚠ Главный результат метода, а не списка: **из 46 кандидатов бэклога опровержение пережили ДВА** — остальное трекерная инерция; а то, чего в трекере не было ВОВСЕ, оказалось тяжелее всего, что в нём есть (строки **269–275**, заведены этим же заходом). Порядок: > **(1) ЭКСПЛУАТАЦИЯ — ✅ ЗАКРЫТА ЛЕНДИНГОМ 05.09 (`7e2226a` + `3e84716`, акт D39.201): бэкапы с ПРЕДЪЯВЛЕННЫМ восстановлением, дверь для не-браузерного клиента, имя книги. Строки 269 · 270 · 274 закрыты и сняты из таблицы; ниже — история заказа.** Строка **269** бэкапов нет ни у оплаченной работы, ни у денежного реестра — ЕДИНСТВЕННАЯ находка дня без частичного исхода: одна потеря диска необратима и недоказуема · строка **270** у продукта НОЛЬ дверей: `bearerToken` объявлен и не выдаётся, живой цикл 04.09 прошёл через dev-вход, который прод отказывается запускать, фронт заморожен · строка **274** имя книги в выданном файле исходноязычное и не чинится ничем (дёшево, а ломается первое, что видит человек). @@ -102,7 +102,7 @@ > **(2) ⚠ ДАННЫЕ ЯЗЫКОВОГО ПАКЕТА — ТОЖЕ.** Правка `backend/internal/lang/data/*.txt` двигает `EmbeddedVersion` → `cutTag` (докстринг `backend/internal/pipeline/manifest.go`: «the embedded data feeds the CJK numerals and sentence terminators that place boundaries») → ключ валидности манифеста → на платформе `recut := storedKey != in.ManifestKey` (`platform/internal/pgstore/readmodel.go`) → `delete from unit_resolutions where book_id`. То есть у книги, за которую заплачено, исчезают замечания читателя и счётчики глав — это строка бэклога **198**. ⇒ **Лендинг правки данных не кладётся, пока книга платного прогона живая**; порядок лендинга — обязанность оркестратора, зоны об этом предупреждены пингами 04.09. Рычаг у бэкенда есть и он объявлен предпочтительным: снять рендер в Go, данные не трогать): бэкенд — вайр-батч `docs/BACKEND_WIREBATCH_SESSION_PROMPT.md`; платформа — «закрыть цикл» `docs/PLATFORM_EXPORT_SESSION_PROMPT.md`. ⚠ Строка **160** взята, но идёт СВОИМ паком ПОСЛЕ двери: она бампает `manifestVersion`, у которого безопасного порядка деплоя нет (`D39.190` п.2). Строка **142** — после шагов 0–1 полигона (`D39.190` п.3). > **Предыдущие паки ОТРАБОТАНЫ 03.09, ПРИНЯТЫ С ДОФИКСОМ и заленджены** — `D39.187` движок, `D39.188` платформа; составы и приёмочные дампы ТЕЛАМИ НОТ, промты в `archive/prompts/` с баннерами исхода, план паков — `archive/reports/NEXT_PACKS_PLAN_2026-09-03.md`, решения — D39.190. ⚠ Живое отсюда одно и оно уже вылечено паком P13: **у формы манифеста БЕЗОПАСНОГО ПОРЯДКА ДЕПЛОЯ НЕТ** — гейт интейка сравнивает версию со строгим равенством одной константе (`platform/internal/ingest/manifest.go`, греп `KnownManifestVersion`), окна двух версий нет, поэтому порядок «сначала платформа, потом движок» из рантбука разворачивается на обратный. -✅ **СНЯТО ЛЕНДИНГОМ 06.09 (`D39.208`): гейта БОЛЬШЕ НЕТ.** Флаг едет в argv на КАЖДОМ спавне и пересчитывается, а названное ниже «живое основание» вылечено расширением условия — `--resnapshot` теперь едет на ЛЮБОМ продолжении, не только после правки банка (`PD-422`). Ниже — прежняя редакция, историей: ⛔ **Проводка `--max-units` в платформу остаётся ГЕЙЧЕНОЙ. Живое основание одно и оно механическое:** единственный писатель `bank_moved_at` — дверь правок банка (`platform/internal/runs/bank.go:211`=`one statement sets it`), а рост АВТО-банка от майнинга этого флага не ставит, поэтому майнящая книга на второй покупке идёт без `--resnapshot` и умирает на снапшот-гарде движка — холд взят, попытка сожжена (`PD-422`). ⚠ **Сюда же переехал остаток закрытой строки 234 (испр. 05.09): проводка полей `rebill_*` через шов — часть ЭТОГО гейта, а не отдельная работа**; ревизия справедливо заметила, что после закрытия 234 её остаток остался без видимого носителя. Это чинится проводкой признака движения банка от майнинга, а не решением владельца. +✅ **СНЯТО ЛЕНДИНГОМ 06.09 (`D39.208`): гейта БОЛЬШЕ НЕТ.** Флаг едет в argv на КАЖДОМ спавне и пересчитывается, а названное ниже «живое основание» вылечено расширением условия — `--resnapshot` теперь едет на ЛЮБОМ продолжении, не только после правки банка (`PD-422`). Ниже — прежняя редакция, историей: ⛔ **Проводка `--max-units` в платформу остаётся ГЕЙЧЕНОЙ. Живое основание одно и оно механическое:** единственный писатель `bank_moved_at` — дверь правок банка (`platform/internal/runs/bank.go:233`=`one statement sets it`), а рост АВТО-банка от майнинга этого флага не ставит, поэтому майнящая книга на второй покупке идёт без `--resnapshot` и умирает на снапшот-гарде движка — холд взят, попытка сожжена (`PD-422`). ⚠ **Сюда же переехал остаток закрытой строки 234 (испр. 05.09): проводка полей `rebill_*` через шов — часть ЭТОГО гейта, а не отдельная работа**; ревизия справедливо заметила, что после закрытия 234 её остаток остался без видимого носителя. Это чинится проводкой признака движения банка от майнинга, а не решением владельца. **ОТКРЫТО НА ОРКЕСТРАТОРЕ №22:** ~~**Ресёрч-сессия `textmachine-36`** — лендинг `research/29`~~ **ЗАКРЫТО 04.09.** Оба отчёта топологии заленджены полигоном на СВОЕЙ ветке по прямому указанию владельца (`a7951a7`) и приехали в `main` мержем ветки — то есть маршрутом, который и был назван правильным. Файлы на месте: `docs/archive/research/29-harness-topology-survey.md` и `…-codex.md`. diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 0d9700aa..3f718131 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -324,6 +324,30 @@ > ⭐ **И лечение класса, а не случая:** адрес, выданный ЧУЖОЙ зоне, обязан быть ТОКЕНОМ для грепа, а не номером строки — > номер стареет в тот же день, когда кто-нибудь трогает файл, и стареет молча. Это третий промах подряд по ряду **457**. +> ⚠ **Эррата 17.09-л (адреса в телах `D39.x`, уехавшие от лендинга платформенного пака `bde8f5f`).** Тела нот +> НЕ переписываются (`D23.3`), поэтому живые адреса раздаются здесь. Все четыре найдены ПОИСКОМ ТОКЕНА, а +> не сдвигом на дельту, и каждый проверен по содержимому цели: +> `platform/internal/httpapi/v0.go:320` → **`:336`** =`null when no manifest`; `platform/internal/runs/runs.go:490` +> → **`:513`** =`if quote.Chapters == 0`; `platform/internal/config/config.go:345-346` → **`:456-457`** +> (=`defaultSessionIdle` и `defaultSessionMaxAge`, 14 и 30 суток — проза нот утверждает обе величины, и они +> живут в одном блоке констант); `platform/internal/config/config.go:551` → **`:559`** =`l.env("TM_PLATFORM_ENGINE_KEYS_PATH"`. +> ⚠ Последние два разрешены НЕ токеном: `defaultSessionIdle` встречается в файле ЧЕТЫРЕЖДЫ (`:354` присваивание, +> `:450` комментарий, `:456` константа, `:473` оверрайд), `ENGINE_KEYS_PATH` — дважды (`:559` чтение, `:585` текст +> ошибки). Выбор сделан ЧТЕНИЕМ ПРОЗЫ носителя: она утверждает ВЕЛИЧИНЫ ⇒ константа, и что платформа +> ЧИТАЕТ свой путь ⇒ чтение, а не валидация. **Поиск токена сузил остаток, решило чтение** — там, где токен +> неуникален, «найти поиском» недостаточно. +> ⛔ **Подтверждение класса, и формулирую его точно, потому что первая редакция этой эрраты соврала.** Я +> написал было, что `v0.go:336` «уехал снова» — НЕВЕРНО: `:336` жив, его дала эррата `17.09-к`, и список зоны +> платформы подтверждает переход `:320 → :336`. Уехал не адрес, а **осталось протухшим ТЕЛО ноты**, которое +> по-прежнему несёт `:320` и переписано быть не может. ⇒ настоящий класс: **эррата в шапке становится +> единственным носителем живого адреса, а тело ноты навсегда сохраняет мёртвый** — и читатель, грепнувший +> тело, найдёт мёртвый ПЕРВЫМ. Отсюда форма, третий раз подряд по ряду **457**: **чужой зоне и телам нот +> адрес выдаётся ТОКЕНОМ для грепа, номер строки — только подсказка, и так и помечается.** +> ⭐ Провенанс: расхождение нашла и пере-навела свои якоря зона платформы сама, замером «якоря на ревизии ДО +> лендинга против HEAD, док и цель из ОДНОЙ ревизии» — 78 против 86 при 5 → 31 протухших, из них 26 новых и все +> в файлах её пака. Её вывод «это хвост моего пака, а не долг зоны» проверен мной пере-снятием пяти адресов: +> у каждого ровно одно вхождение токена в файле. + ## D22. Приёмка пакетов «бэкенд №3» и «полигон-erotica» + развязки 18+/эха/L3 (10.07, оркестратор). ✅ diff --git a/docs/orchestrator-norms-scratchpad.md b/docs/orchestrator-norms-scratchpad.md index 7701a316..002eed2e 100644 --- a/docs/orchestrator-norms-scratchpad.md +++ b/docs/orchestrator-norms-scratchpad.md @@ -120,7 +120,7 @@ UNKNOWN 1 — её, дошёл один раз до правок; десять | 14 | бэкенд | РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ: базис решённого как ИСТОЧНИК ОТВЕТОВ (ряд 130) + страж разрыва окон (ряд 490) | textmachine-main-57 | ✅ **своими словами, десять пунктов, механика а не текст** — и ДО начала работы названы два кандидата на отказ с замером (ряд 447 как смена продуктового поведения · сторож растущей книги, чья посылка вынесена владельцу и ответа не имеет). Ошибок понимания в эхо нет: воспроизведены порядок блоков, инвариант «базис — ИСТОЧНИК ответа, не фильтр», один писатель на двух границах, инвариантность отпечатка к способу отбора при пар-данной ширине, обязательность статуса `draft` и развилка юнитов. ⛔ **РЕЛЕЙ 17.09, через считанные минуты после выдачи: база прогона A в промте была названа НЕ ТА, и сессия уже строила прибор.** Я вписал `evidence/v16-readonly/project.db` — замер: `book_id` `guzhenren-coldrun-v16`, глоссарий 53, Σ`cost_usd` 0.43611; платный A — `stand/books/bk_ROEHZBD46ALFI43E/project.db`, глоссарий **69** (число всех банковых замеров), Σ **0.419423**, сходится с ратифицированной суммой. Нашёл советчик, пере-снял я. Той же правкой доехали три ловушки материала: все `book.yaml` прогонов ссылаются на несуществующий `/home/ubuntu-26/…` (загрузка либо падает, либо ТИХО берёт конфиги головы) · вход контура `mining-contrast.zh.txt` в git отсутствует вовсе и живёт только в зеркалах прогонов · базы в WAL-режиме, копировать с `-wal`/`-shm`. ⚠ Урок мой: **материал замера я назвал по имени каталога, а не по замеру содержимого** — «evidence» и «readonly» звучали как платная улика, и этого хватило, чтобы не открыть базу. Заказ, отправляющий мерить не тот предмет, дороже битого якоря: якорь виден линтеру, неверная база — никому. ⏳ **ДОЛГ НА ЛЕНДИНГ ЭТОГО ПАКА, записан чтобы не растворился:** ⚠ **ЧИСЛО ПЕРЕ-СНЯТО ВЕЧЕРОМ: не два якоря, а ДВАДЦАТЬ ПЯТЬ, и это не долг, а движущаяся цель.** Пак 57 переписывает восемнадцать путей движка, `terminologist.go` вырос 1473 → 1549 строк, и разбор трёх состояний даёт: **22 ПЕРЕЕХАЛИ** (токен в файле есть, уехал номер — напр. `attachClassifiedGender stamps` с :1306 на :1382, `paidAfterBurns` с :899 на :975), **2 транзиентных** (жив в срезе, нет в дереве), **0 исчезнувших совсем**. ⛔ Первый мой счёт различал только два состояния и отправил 22 позиции в «неизмеренное», которое я чуть не прочитал как «всё хорошо»: **прибор, у которого корзин меньше, чем состояний у предмета, печатает правдоподобный итог и молчит о разнице.** ⇒ после лендинга пака 57 пере-нацелить ВСЕ позиции одной правкой, считая по трём состояниям, а не по двум. Прежняя редакция записи (ниже) называла два якоря — она верна по механизму и занижена по числу. Механизм: правка зоны в `backend/internal/lang/langpack.go` сдвинула файл на 12 строк, и первые ДВА якоря стали транзиентно красны — `docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md` → `langpack.go:744`=`kwic_per_term` (живёт на `:756`) и `docs/BACKLOG.md:277`=`manifest declares no channel` (ряд 347) → та же цель `langpack.go:632`, живущая теперь на `:644`. Замер, различающий транзиент от долга: оба токена ЦЕЛЫ в срезе `HEAD` на прежних строках и мертвы только в дереве ⇒ это чужой незакоммиченный WIP в цели, о котором прибор предупреждает сам, а не моя гниль. ⛔ Чинить ДО лендинга нельзя — цель движется, и пере-нацеливание сломается при следующей её правке или при откате. ⚠ Но у второго якоря есть и НЕ транзиентная половина: путь написан не от корня (`lang/langpack.go`), и это дефект формы, переживший сегодняшнюю чистку, потому что мой шаблон искал только полные пути. ⇒ после лендинга ОДНОЙ правкой: развернуть путь и пере-нацелить оба якоря по найденным, а не вычисленным адресам | ⏳ **ВЫДАН 17.09** после опроса кандидатов (свежих нашлось ДВЕ — `57` и `78`; взята `57`, второй сказано не занимать зону). Оба рубежа пройдены: механическая сверка 13 блоков (27 якорей, все живы, токен по адресу, коротких нет) и субагент-опровергатель — **12 находок, 9 денежных, все внесены**. ⭐ Чем окупился опровергатель: (1) я вписал «текста в коде УЖЕ НЕТ, 0 совпадений» о строке, которая ЖИВА ДОСЛОВНО, — грепал по одному файлу, увидел начало длинной строки, обрезанной по ширине, и прочёл обрезок как ФАКТ; у неё вдобавок третий носитель, голден операторских сообщений, которого я не видел вовсе; (2) замер M1 был заказан на копиях купленных баз, а таблицы чанков в них НЕТ (17 и 16 таблиц) — предмет из них не строится, нужен исходник отдельным файлом; (3) порядок записи на границе стопа задаёт САМ КОД («последним пишется то, чья потеря дешевле»), и по нему базис идёт ПЕРЕД памятью флажка, а не пятым, как велел консилиум; (4) ширину отпечатка я заказал константой Go — это утечка пары в общий слой, закрытая `D39.50`, причём на денежном предикате. ⛔ **И урок абзацем ниже — про эту самую выдачу: приоритет пака у владельца я НЕ подтверждал.** Слот бэкенда свободен, но «слот свободен ≠ работу зоны надо заказывать»; поэтому промт лежит файлом, исполнитель не назначен, и решение о выдаче — за владельцем. ⚠ В самой выдаче, когда она состоится, повторить норму строки 13: ВЕРНУТЬ заказ, если сессия не свежая | -| 15 | платформа | ПРОГОН НЕ ВРЁТ О СЕБЕ — ни оператору, ни покупателю, ни счёту: ряды 398 · 394 · 396 · 399 · 400 · 416 · 486 | textmachine-main-78 | ✅ эхо блока 9 отослано | ✅ **ЗАКРЫТ АКТОМ `D39.265` 17.09**, лендинг `bde8f5f` (41 файл, $0, контрактный минор **0.17.0**). Ряды 398·399·400·486 закрыты работой, 394 и 396 ПЕРЕ-РЕШЕНИЕМ, 416 половиной; заведены 493 и 494, дополнен 484. ⛔ **Гейт зоны на финальном дереве КРАСЕН и назван ГРАНИЦЕЙ, а не зеленью** — экземпляр ряда 484, оба упавших теста живут в чистом `HEAD`. Приёмка: кампания пере-снята мной 26/25/1/0 на отдельном корне её же харнессом, копия вернулась байт-идентичной, все 26 целей на месте; деньги $0 двумя путями; две линзы (слепая по заказу и диффу, вторая вне карты отчёта) дали три настоящих находки, две из них в каноне. ⚠ **МОИ ошибки, обе в акте:** взял себе правку канона, принадлежащую ЗОНЕ (откатил, дифф 0 строк, поймал ВЛАДЕЛЕЦ) и неточная посылка §4.1 промта. ⚠ Плюс три дефекта собственных приборов, каждый пойман печатью контроля рядом с числом: шапка манифеста прочитана как пары «хеш—имя» (23 ложных расхождения при 37/37 сошедшихся), греп маркера у пойманных мутаций (маркеры стоят только у выживших, намеренно), «0 скипов» из сводки, оборванной падением (в полном логе 10). ⏳ **ВЫДАН 17.09.** Собран ВЕЕРОМ из четырёх срезов за один заход — против девяти последовательных кругов, которыми я собирал предыдущий пак; это и есть разница в способе работы, а не во времени. Оба рубежа пройдены: механическая сверка 13 блоков (18 якорей с токеном, промахов 0, голых адресов 0) и опровергатель — **10 находок, 4 денежные, все внесены**. ⛔ **Самая дорогая — против меня: §4.2 заказывал ПОСТРОЕННОЕ.** Я написал, что наш собственный грейс читается как авария; вылечено 11.09 (`platform/internal/runs/reconcile.go:1183`=`return "interrupted"`, два пина в `gracekill_test.go`, коммит `00d590e`, принято `D39.242`), а ряд 394 протух и я поверил ряду вместо дерева. ⚠ Ещё три денежные: предмет капа уже стоит в регистре зоны весом `info` с прописанным лечением, а я назвал его «самым денежным» · механизм счётчика описал неверно (он живёт на ПОПЫТКЕ, а рестарт открывает новую строку, поэтому кап на попытку повторил бы дефект) · согласие нельзя сделать соразмерным силами платформы: проекции в точке решения нет по построению, и код это записал со ссылкой на эрратy, а ряд размечен двухзонным. ⚠ И ловушка, которой не было в первой редакции: словарь причин отказа закрыт в ТРЁХ носителях, включая констрейнт базы, и не стережётся НИ ОДНИМ гейтом (0 хитов при контроле 12 у соседа) — четвёртое значение прошло бы `make check` зелёным и упало в проде | +| 15 | платформа | ПРОГОН НЕ ВРЁТ О СЕБЕ — ни оператору, ни покупателю, ни счёту: ряды 398 · 394 · 396 · 399 · 400 · 416 · 486 | textmachine-main-78 | ✅ эхо блока 9 отослано | ✅ **ЗАКРЫТ АКТОМ `D39.265` 17.09**, лендинг `bde8f5f` (41 файл, $0, контрактный минор **0.17.0**). Ряды 398·399·400·486 закрыты работой, 394 и 396 ПЕРЕ-РЕШЕНИЕМ, 416 половиной; заведены 493 и 494, дополнен 484. ⛔ **Гейт зоны на финальном дереве КРАСЕН и назван ГРАНИЦЕЙ, а не зеленью** — экземпляр ряда 484, оба упавших теста живут в чистом `HEAD`. Приёмка: кампания пере-снята мной 26/25/1/0 на отдельном корне её же харнессом, копия вернулась байт-идентичной, все 26 целей на месте; деньги $0 двумя путями; две линзы (слепая по заказу и диффу, вторая вне карты отчёта) дали три настоящих находки, две из них в каноне. ⚠ **МОИ ошибки, обе в акте:** взял себе правку канона, принадлежащую ЗОНЕ (откатил, дифф 0 строк, поймал ВЛАДЕЛЕЦ) и неточная посылка §4.1 промта. ⚠ Плюс три дефекта собственных приборов, каждый пойман печатью контроля рядом с числом: шапка манифеста прочитана как пары «хеш—имя» (23 ложных расхождения при 37/37 сошедшихся), греп маркера у пойманных мутаций (маркеры стоят только у выживших, намеренно), «0 скипов» из сводки, оборванной падением (в полном логе 10). ⏳ **ВЫДАН 17.09.** Собран ВЕЕРОМ из четырёх срезов за один заход — против девяти последовательных кругов, которыми я собирал предыдущий пак; это и есть разница в способе работы, а не во времени. Оба рубежа пройдены: механическая сверка 13 блоков (18 якорей с токеном, промахов 0, голых адресов 0) и опровергатель — **10 находок, 4 денежные, все внесены**. ⛔ **Самая дорогая — против меня: §4.2 заказывал ПОСТРОЕННОЕ.** Я написал, что наш собственный грейс читается как авария; вылечено 11.09 (`platform/internal/runs/reconcile.go:1226`=`return "interrupted"`, два пина в `gracekill_test.go`, коммит `00d590e`, принято `D39.242`), а ряд 394 протух и я поверил ряду вместо дерева. ⚠ Ещё три денежные: предмет капа уже стоит в регистре зоны весом `info` с прописанным лечением, а я назвал его «самым денежным» · механизм счётчика описал неверно (он живёт на ПОПЫТКЕ, а рестарт открывает новую строку, поэтому кап на попытку повторил бы дефект) · согласие нельзя сделать соразмерным силами платформы: проекции в точке решения нет по построению, и код это записал со ссылкой на эрратy, а ряд размечен двухзонным. ⚠ И ловушка, которой не было в первой редакции: словарь причин отказа закрыт в ТРЁХ носителях, включая констрейнт базы, и не стережётся НИ ОДНИМ гейтом (0 хитов при контроле 12 у соседа) — четвёртое значение прошло бы `make check` зелёным и упало в проде | | 16 | бэкенд | АНГЛИЙСКАЯ ПАРА en→ru: слой ДАННЫХ английского языка как ПРОДУКТ (слово владельца 17.09 — «данные надо написать… уникально описать английский язык… от этого качество перевода зависит»), две стены `EXIT 10` (нет промт-пакета пары · гейт терминолога при пустом паке), порог эха `0.15` унаследован от китайского бенчмарка, второй детектор латиницы без гейта, нарезка книги Кристоффа | `textmachine-main-c5` | ✅ **эхо принято 17.09** — своими словами, семь пунктов, механика а не текст; ⭐ в нём взята ПОПУЛЯЦИЯ ГРУППЫ, а не документа, то есть моя собственная ошибка первой редакции НЕ унаследована, и сквозная проверка манифеста поставлена ПЕРЕД письмом данных | 🔴 **ИДЁТ** — выдан после акта `D39.266`, слот освободил акт, а не сдача работы. Два рубежа промта пройдены: механическая сверка 13 блоков (29 адресов, битых 0) и субагент-опровергатель — **15 находок, 9 приняты, 6 уточнены моими числами**, из них ЧЕТЫРЕ мои ошибки ПОПУЛЯЦИИ (документ вместо группы · отозванная формулировка ряда 315 прочитана как живая · строка ноты обрезана на 200 знаках и объявлена «телом без содержимого» · сравнение лучшего префикса с перелётом). ⚠ Fable 5 разрешён исполнителю ОДИН — владельцем и именно под верификацию ДАННЫХ. $0 по умолчанию; единственная платная проба — через моё слово. ⛔ Открытый вопрос владельцу, сессии сообщён: размеченного корпуса для en→ru нет вовсе, человеческий эталон вне репозитория ⇒ качество данных числом не предъявимо, и самодельную метрику заводить запрещено | ⛔ **ПОЛИГОН СНЯТ ВЛАДЕЛЬЦЕМ 11.09.** Я предлагал пак трижды — `ed`, `5c` (обе отработавшие, отказались ПО НОРМЕ и были правы) и свежей `37`, — после чего владелец сказал «полигон не надо выдавать». Выдача `37` ОТОЗВАНА тем же часом. ⚠ Урок не про полигон: **я трижды искал адресата для заказа, приоритет которого не подтверждал у владельца.** Слот зоны свободен ≠ работу зоны надо заказывать.